// lib/api/training-certificate.api.ts
// API layer for the Training Certificates module
// Uses the same shared fetchApi helper + env base URL as certificate.api.ts

import { fetchApi } from "@/lib/api/http";
import type {
  CreateTrainingCertificateDto,
  BatchCreateTrainingDto,
  CreatedTrainingCertificate,
  BatchCreateTrainingResponse,
  TrainingListResponse,
  TrainingCertificateApi,
  TrainingRowType,
  TrainingStatus,
} from "@/lib/api/types/training-certificate.types";

export const TRAINING_API_BASE_URL =
  process.env.NEXT_PUBLIC_API_URL || "https://crm.qrsyst.com/api";

const BASE = `${TRAINING_API_BASE_URL}/training-certificates`;

/* ── List (server-side pagination + search) ─────────── */
export function getTrainingCertificatesPaginated(params: {
  page: number;
  search?: string;
}): Promise<TrainingListResponse> {
  const qs = new URLSearchParams({ page: String(params.page) });
  if (params.search) qs.set("search", params.search);
  return fetchApi<TrainingListResponse>(`${BASE}?${qs.toString()}`);
}

/* ── Single ─────────────────────────────────────────── */
export function getTrainingCertificate(id: number): Promise<{
  certificate: TrainingCertificateApi;
  verification_url: string;
  qrCode: string;
}> {
  return fetchApi(`${BASE}/${id}`);
}

/* ── Create (single) ────────────────────────────────── */
export function createTrainingCertificate(
  dto: CreateTrainingCertificateDto,
): Promise<CreatedTrainingCertificate> {
  return fetchApi<CreatedTrainingCertificate>(BASE, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(dto),
  });
}

/* ── Create (batch — whole training session) ────────── */
export function batchCreateTrainingCertificates(
  dto: BatchCreateTrainingDto,
): Promise<BatchCreateTrainingResponse> {
  return fetchApi<BatchCreateTrainingResponse>(`${BASE}/batch`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(dto),
  });
}

/* ── Update (partial — also used for status changes) ── */
export function updateTrainingCertificate(
  id: number,
  dto: Partial<CreateTrainingCertificateDto> & { status?: TrainingStatus },
): Promise<TrainingCertificateApi> {
  return fetchApi<TrainingCertificateApi>(`${BASE}/${id}`, {
    method: "PATCH",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(dto),
  });
}

/* ── Delete ─────────────────────────────────────────── */
export function deleteTrainingCertificate(
  id: number,
): Promise<{ message: string }> {
  return fetchApi<{ message: string }>(`${BASE}/${id}`, {
    method: "DELETE",
  });
}

/* ── Upload signed scan (multipart — plain fetch) ───── */
// NOTE: uses plain fetch because the payload is FormData, not JSON.
// If your fetchApi attaches auth headers, replicate them here.
export async function uploadTrainingScan(
  id: number,
  file: File,
): Promise<{ message: string; certificate: TrainingCertificateApi }> {
  const formData = new FormData();
  formData.append("scan", file);

  // Read auth token the same way fetchApi does
  const token =
    typeof window !== "undefined"
      ? localStorage.getItem("access_token") ||
        sessionStorage.getItem("access_token")
      : null;

  const res = await fetch(`${BASE}/${id}/scan`, {
    method: "POST",
    credentials: "include",
    headers: {
      ...(token ? { Authorization: `Bearer ${token}` } : {}),
    },
    body: formData,
  });

  if (!res.ok) {
    let message = `Upload failed (${res.status})`;
    try {
      const body = await res.json();
      if (body?.message) {
        message = Array.isArray(body.message)
          ? body.message.join(", ")
          : body.message;
      }
    } catch {
      /* keep default */
    }
    throw new Error(message);
  }
  return res.json();
}

/* ── Mapper: API rows → table rows ──────────────────── */
export function mapTrainingApiResponse(
  data: TrainingCertificateApi[],
  page = 1,
  perPage = 10,
): TrainingRowType[] {
  return (data || []).map((c, idx) => ({
    sno: (page - 1) * perPage + idx + 1,
    id: c.id,
    certificate_no: c.certificate_no,
    participant_name: c.participant_name,
    participant_company: c.participant_company || "",
    course_title: c.course_title,
    standard_name: c.standard?.title || c.standard?.name || "",
    training_location: c.training_location,
    training_date: c.training_date,
    training_date_end: c.training_date_end,
    valid_until: c.valid_until,
    status: c.status,
    verification_domain: c.verification_domain,
    batch_ref: c.batch_ref || "",
    scan_pdf_url: c.scan_pdf_url,
    scan_uploaded_at: c.scan_uploaded_at,
    qrCode: c.qrCode || "",
    verification_url: c.verification_url || "",
    created_at: c.created_at,
  }));
}