import apiClient from "./apiClient";

export type ClientStatus = "active" | "inactive";
export type ClientType = "confidential" | "public";

export type ClientSummary = {
  id: string;
  name: string;
  type: ClientType;
  status: ClientStatus;
  createdAt?: string;
  redirectUris: string[];
  scopes: string[];
};

export type ClientListResponse = {
  items: ClientSummary[];
  limit: number;
  offset: number;
};

export type ClientEndpoints = {
  discovery: string;
  issuer: string;
  authorization: string;
  token: string;
  userinfo: string;
};

export type ClientDetailResponse = {
  client: ClientSummary & {
    metadata?: Record<string, unknown>;
  };
  endpoints: ClientEndpoints;
};

export type ClientUpsertRequest = {
  id?: string;
  name?: string;
  type?: ClientType;
  status?: ClientStatus;
  redirectUris?: string[];
  scopes?: string[];
  grantTypes?: string[];
  responseTypes?: string[];
  tokenEndpointAuthMethod?: string;
  metadata?: Record<string, unknown>;
};

export type ConsentSummary = {
  subject: string;
  clientId: string;
  clientName?: string;
  grantedScopes: string[];
  authenticatedAt?: string;
};

export type ConsentListResponse = {
  items: ConsentSummary[];
};

export async function fetchClients() {
  const { data } = await apiClient.get<ClientListResponse>("/clients");
  return data;
}

export async function fetchClient(clientId: string) {
  const { data } = await apiClient.get<ClientDetailResponse>(
    `/clients/${clientId}`,
  );
  return data;
}

export async function updateClientStatus(
  clientId: string,
  status: ClientStatus,
) {
  const { data } = await apiClient.patch<ClientDetailResponse>(
    `/clients/${clientId}/status`,
    { status },
  );
  return data;
}

export async function createClient(payload: ClientUpsertRequest) {
  const { data } = await apiClient.post<ClientDetailResponse>(
    "/clients",
    payload,
  );
  return data;
}

export async function updateClient(
  clientId: string,
  payload: ClientUpsertRequest,
) {
  const { data } = await apiClient.put<ClientDetailResponse>(
    `/clients/${clientId}`,
    payload,
  );
  return data;
}

export async function deleteClient(clientId: string) {
  await apiClient.delete(`/clients/${clientId}`);
}

export async function fetchConsents(subject: string, clientId?: string) {
  const params: Record<string, string> = { subject };
  if (clientId) {
    params.client_id = clientId;
  }
  const { data } = await apiClient.get<ConsentListResponse>("/consents", {
    params,
  });
  return data;
}

export async function revokeConsent(subject: string, clientId?: string) {
  const params: Record<string, string> = { subject };
  if (clientId) {
    params.client_id = clientId;
  }
  await apiClient.delete("/consents", { params });
}
