import { fetchApi } from "@/lib/api/http";
import type {
  Certificate,
  CreateCertificateDto,
  UpdateCertificateDto,
  CreateCertificateResponse,
  CreateCertificateResultItem,
  VerifyCertificateResponse,
  BulkScanResponse,
  PaginatedCertificatesResponse,
  PaginatedLegacyExcelResponse,
} from "@/lib/api/types/certificate.types";

export const CERTIFICATES_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3008/api";

// ─── Query params ──────────────────────────────────────────────────────────
export interface CertificateQueryParams {
  page?: number;
  search?: string;
}

// ─── List (paginated) ──────────────────────────────────────────────────────
export async function getCertificatesPaginated(
  params: CertificateQueryParams = {},
): Promise<PaginatedCertificatesResponse> {
  const { page = 1, search } = params;
  const query = new URLSearchParams();
  query.set("page", String(page));
  if (search) query.set("search", search);
  return fetchApi<PaginatedCertificatesResponse>(
    `${CERTIFICATES_API_BASE_URL}/certificates?${query.toString()}`,
  );
}

// ─── Get one ───────────────────────────────────────────────────────────────
export async function getCertificate(id: number): Promise<{
  certificate: Certificate;
  verification_url: string;
  qrCode: string;
}> {
  return fetchApi(`${CERTIFICATES_API_BASE_URL}/certificates/${id}`);
}

// ─── Create — normalize response to always return {summary, certificates[]} ─
export async function createCertificate(
  dto: CreateCertificateDto,
): Promise<CreateCertificateResponse> {
  const raw = await fetchApi<any>(`${CERTIFICATES_API_BASE_URL}/certificates`, {
    method: "POST",
    body: JSON.stringify(dto),
  });

  // Shape 1: already normalized { summary, certificates: [...] }
  if (raw?.summary && Array.isArray(raw.certificates)) {
    return raw as CreateCertificateResponse;
  }

  // Shape 2: array (multi-standard legacy)
  if (Array.isArray(raw)) {
    const items: CreateCertificateResultItem[] = raw.map((r: any) => ({
      certificate: r.certificate,
      qrCode: r.qrCode ?? r.qrCodeDataUrl,
      verification_url: r.verification_url ?? "",
      action: r.action ?? "GENERATED",
      source: r.source ?? "new",
    }));
    return {
      summary: {
        total: items.length,
        reused: items.filter((i) => i.action === "REUSED").length,
        generated: items.filter((i) => i.action === "GENERATED").length,
      },
      certificates: items,
    };
  }

  // Shape 3: single object
  const item: CreateCertificateResultItem = {
    certificate: raw.certificate,
    qrCode: raw.qrCode ?? raw.qrCodeDataUrl,
    verification_url: raw.verification_url ?? "",
    action: raw.action ?? "GENERATED",
    source: raw.source ?? "new",
  };
  return {
    summary: {
      total: 1,
      reused: item.action === "REUSED" ? 1 : 0,
      generated: item.action === "GENERATED" ? 1 : 0,
    },
    certificates: [item],
  };
}

// ─── Update ────────────────────────────────────────────────────────────────
export async function updateCertificate(
  id: number,
  dto: UpdateCertificateDto,
): Promise<Certificate> {
  return fetchApi<Certificate>(
    `${CERTIFICATES_API_BASE_URL}/certificates/${id}`,
    {
      method: "PATCH",
      body: JSON.stringify(dto),
    },
  );
}

// ─── Delete ────────────────────────────────────────────────────────────────
export async function deleteCertificate(id: number): Promise<void> {
  return fetchApi<void>(`${CERTIFICATES_API_BASE_URL}/certificates/${id}`, {
    method: "DELETE",
  });
}

// ─── Public verify ─────────────────────────────────────────────────────────
export async function verifyCertificate(
  token: string,
  fingerprint?: string,
): Promise<VerifyCertificateResponse> {
  const q = new URLSearchParams({ token });
  if (fingerprint) q.set("fp", fingerprint);
  return fetchApi<VerifyCertificateResponse>(
    `${CERTIFICATES_API_BASE_URL}/certificates/verify?${q.toString()}`,
  );
}

// ─── Bulk scan upload ──────────────────────────────────────────────────────
export async function uploadBulkScans(
  files: File[],
): Promise<BulkScanResponse> {
  const token =
    typeof window !== "undefined"
      ? localStorage.getItem("access_token") ||
        sessionStorage.getItem("access_token")
      : null;

  const fd = new FormData();
  files.forEach((f) => fd.append("files", f));

  const res = await fetch(
    `${CERTIFICATES_API_BASE_URL}/certificates/bulk-scan/upload`,
    {
      method: "POST",
      credentials: "include",
      headers: {
        ...(token ? { Authorization: `Bearer ${token}` } : {}),
      },
      body: fd,
    },
  );

  if (!res.ok) {
    const text = await res.text();
    throw new Error(text || "Bulk scan upload failed");
  }
  return res.json();
}

// ─── Legacy Excel search (for surveillance/recert lookup) ──────────────────
export async function searchLegacyExcel(
  companyName: string,
  limit = 10,
): Promise<PaginatedLegacyExcelResponse> {
  const q = new URLSearchParams({
    q: companyName,
    limit: String(limit),
  });
  return fetchApi<PaginatedLegacyExcelResponse>(
    `${CERTIFICATES_API_BASE_URL}/excel/search?${q.toString()}`,
  );
}
