import type {
  InternalUser,
  InternalUserStats,
  InviteInternalUserPayload,
  PermissionMatrix,
  UpdateInternalUserPayload,
} from "@/domain/entities/internal-user";
import type { InternalUserRepository } from "@/domain/repositories/internal-user.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

export class InternalUserRepositoryImpl implements InternalUserRepository {
  findAll(params: PaginationQueryParams) {
    // The list endpoint expects multi-select array params (role[], status[]).
    const { role, status, ...rest } = params;
    const query: Record<string, unknown> = { ...rest };
    if (role !== undefined && role !== "") query["role[]"] = role;
    if (status !== undefined && status !== "") query["status[]"] = status;
    return api.get<BackendPaginatedData<InternalUser>>("/internal-users", { params: query });
  }

  getStats() {
    return api.get<InternalUserStats>("/internal-users/stats");
  }

  invite(payload: InviteInternalUserPayload) {
    return api.post<InternalUser>("/internal-users", payload);
  }

  update(id: number, payload: UpdateInternalUserPayload) {
    return api.put<InternalUser>(`/internal-users/${id}`, payload);
  }

  delete(id: number) {
    return api.delete(`/internal-users/${id}`);
  }

  suspend(id: number) {
    return api.post<void>(`/internal-users/${id}/suspend`);
  }

  activate(id: number) {
    return api.post<void>(`/internal-users/${id}/activate`);
  }

  resendInvitation(id: number) {
    return api.post<void>(`/internal-users/${id}/resend-invitation`);
  }

  getPermissions(id: number) {
    return api.get<PermissionMatrix>(`/internal-users/${id}/permissions`);
  }

  savePermissions(id: number, permissions: Record<string, boolean>) {
    return api.put<PermissionMatrix>(`/internal-users/${id}/permissions`, { permissions });
  }
}
