import { fetchApi } from './http';
import type {
  MyAuditsListResponse,
  MyAuditsAnalytics,
  AuditWorkspaceResponse,
  MyAuditRow,
} from './types/my-audits.types';

const API_BASE_URL =
  process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3007/api';

// ─────────────────────────────────────────────────────────────────────────────
// GET /my-audits — paginated list of audits assigned to current user
// ─────────────────────────────────────────────────────────────────────────────
export interface GetMyAuditsParams {
  page?: number;
  limit?: number;
  search?: string;
  status?: string;
  date_preset?: string;
  date_from?: string;
  date_to?: string;
}

export async function getMyAudits(
  params: GetMyAuditsParams = {},
): Promise<MyAuditsListResponse> {
  const qs = new URLSearchParams();
  if (params.page) qs.set('page', String(params.page));
  if (params.limit) qs.set('limit', String(params.limit));
  if (params.search) qs.set('search', params.search);
  if (params.status && params.status !== 'all') qs.set('status', params.status);
  if (params.date_preset && params.date_preset !== 'all')
    qs.set('date_preset', params.date_preset);
  if (params.date_from) qs.set('date_from', params.date_from);
  if (params.date_to) qs.set('date_to', params.date_to);

  const qstr = qs.toString();
  const url = `${API_BASE_URL}/my-audits${qstr ? `?${qstr}` : ''}`;
  return fetchApi<MyAuditsListResponse>(url);
}

// ─────────────────────────────────────────────────────────────────────────────
// GET /my-audits/analytics — KPI counts for the auditor's home
// ─────────────────────────────────────────────────────────────────────────────
export async function getMyAuditsAnalytics(): Promise<MyAuditsAnalytics> {
  return fetchApi<MyAuditsAnalytics>(`${API_BASE_URL}/my-audits/analytics`);
}

// ─────────────────────────────────────────────────────────────────────────────
// GET /audits/:rowId/workspace — single audit workspace (row + request + history)
// ─────────────────────────────────────────────────────────────────────────────
export async function getAuditWorkspace(
  rowId: number,
): Promise<AuditWorkspaceResponse> {
  return fetchApi<AuditWorkspaceResponse>(
    `${API_BASE_URL}/audits/${rowId}/workspace`,
  );
}

// ─────────────────────────────────────────────────────────────────────────────
// PATCH /audits/:rowId/complete — mark an audit complete (auditor self-service)
// ─────────────────────────────────────────────────────────────────────────────
export async function markAuditComplete(rowId: number): Promise<MyAuditRow> {
  return fetchApi<MyAuditRow>(`${API_BASE_URL}/audits/${rowId}/complete`, {
    method: 'PATCH',
  });
}

// ═════════════════════════════════════════════════════════════════════════════
// MY SCHEDULE MASTER — list + counts + Excel/PDF export
// Talks to the separate /my-schedule-master backend module.
// ═════════════════════════════════════════════════════════════════════════════

export interface MasterCounts {
  initial: number;
  surveillance: number;
  recertification: number;
  total: number;
}

export interface MyScheduleMasterResponse {
  data: MyAuditRow[];
  counts: MasterCounts;
  meta: { total: number; page: number; limit: number; totalPages: number };
}

function buildMasterQuery(params: GetMyAuditsParams = {}): string {
  const qs = new URLSearchParams();
  if (params.page) qs.set('page', String(params.page));
  if (params.limit) qs.set('limit', String(params.limit));
  if (params.search) qs.set('search', params.search);
  if (params.status && params.status !== 'all') qs.set('status', params.status);
  if (params.date_preset && params.date_preset !== 'all')
    qs.set('date_preset', params.date_preset);
  if (params.date_from) qs.set('date_from', params.date_from);
  if (params.date_to) qs.set('date_to', params.date_to);
  const s = qs.toString();
  return s ? `?${s}` : '';
}

// GET /my-schedule-master — list + counts (uses your normal fetchApi auth)
export async function getMyScheduleMaster(
  params: GetMyAuditsParams = {},
): Promise<MyScheduleMasterResponse> {
  const url = `${API_BASE_URL}/my-schedule-master${buildMasterQuery(params)}`;
  return fetchApi<MyScheduleMasterResponse>(url);
}

// ── File download helper ──────────────────────────────────────────────────────
// Exports stream a binary file, so we use raw fetch (fetchApi returns JSON).
// We try the common token storage keys; if you use cookie auth instead,
// credentials:'include' already covers it.
function readAuthToken(): string | null {
  if (typeof window === 'undefined') return null;
  const keys = ['access_token', 'token', 'jwt', 'authToken', 'accessToken'];
  for (const k of keys) {
    try {
      const v = localStorage.getItem(k);
      if (v) return v;
    } catch {
      /* ignore */
    }
  }
  return null;
}

async function downloadFile(url: string, fallbackName: string): Promise<void> {
  const token = readAuthToken();
  const res = await fetch(url, {
    headers: token ? { Authorization: `Bearer ${token}` } : {},
    credentials: 'include', // harmless if you use bearer tokens
  });
  if (!res.ok) throw new Error(`Download failed (${res.status})`);

  let filename = fallbackName;
  const cd = res.headers.get('Content-Disposition');
  const match = cd && /filename="?([^"]+)"?/.exec(cd);
  if (match?.[1]) filename = match[1];

  const blob = await res.blob();
  const objUrl = window.URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = objUrl;
  a.download = filename;
  document.body.appendChild(a);
  a.click();
  a.remove();
  window.URL.revokeObjectURL(objUrl);
}

// GET /my-schedule-master/export/excel
export async function downloadMyScheduleMasterExcel(
  params: GetMyAuditsParams = {},
): Promise<void> {
  const url = `${API_BASE_URL}/my-schedule-master/export/excel${buildMasterQuery(params)}`;
  return downloadFile(url, 'my-audit-schedule.xlsx');
}

// GET /my-schedule-master/export/pdf
export async function downloadMyScheduleMasterPdf(
  params: GetMyAuditsParams = {},
): Promise<void> {
  const url = `${API_BASE_URL}/my-schedule-master/export/pdf${buildMasterQuery(params)}`;
  return downloadFile(url, 'my-audit-schedule.pdf');
}