import { fetchApi } from '@/lib/api/http';
import type {
  Inquiry,
  CreateInquiryDto,
  UpdateInquiryDto,
  PaginatedInquiriesResponse,
} from '@/lib/api/types/inquiry.types';

export const INQUIRIES_API_BASE =
   process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:3007/api";

// ─── Query params ───────────────────────────────────────────────────────────
export interface InquiryQueryParams {
  page?:   number;
  limit?:  number;
  status?: string;
  search?: string;
  submitted_by_id?: string; // ✅ NEW — filter by user who submitted
}

// ─── GET paginated ──────────────────────────────────────────────────────────
export async function getInquiriesPaginated(
  params: InquiryQueryParams = {},
): Promise<PaginatedInquiriesResponse> {
  const { page = 1, limit = 20, status, search, submitted_by_id } = params; // ✅ NEW
  const q = new URLSearchParams();
  q.set('page',  String(page));
  q.set('limit', String(limit));
  if (status && status !== 'all') q.set('status', status);
  if (search) q.set('search', search);
  // ✅ NEW — only send if a specific user is selected
  if (submitted_by_id && submitted_by_id !== 'all') {
    q.set('submitted_by_id', submitted_by_id);
  }

  // ✅ DEBUG — see exactly what's being sent to the backend
  console.log('[INQUIRY-API] GET', `${INQUIRIES_API_BASE}/inquiries?${q.toString()}`);

  return fetchApi<PaginatedInquiriesResponse>(
    `${INQUIRIES_API_BASE}/inquiries?${q.toString()}`,
  );
}

// ─── GET one ────────────────────────────────────────────────────────────────
export async function getInquiry(id: number): Promise<Inquiry> {
  return fetchApi<Inquiry>(`${INQUIRIES_API_BASE}/inquiries/${id}`);
}

// ─── POST create ─────────────────────────────────────────────────────────────
export async function createInquiry(dto: CreateInquiryDto): Promise<Inquiry> {
  return fetchApi<Inquiry>(`${INQUIRIES_API_BASE}/inquiries`, {
    method: 'POST',
    body:   JSON.stringify(dto),
  });
}

// ─── PATCH update ────────────────────────────────────────────────────────────
export async function updateInquiry(
  id:  number,
  dto: UpdateInquiryDto,
): Promise<Inquiry> {
  return fetchApi<Inquiry>(`${INQUIRIES_API_BASE}/inquiries/${id}`, {
    method: 'PATCH',
    body:   JSON.stringify(dto),
  });
}

// ─── PATCH generate draft ────────────────────────────────────────────────────
// ✅ Now also returns draft_generated_at for cache-busting on the frontend
export async function generateDraft(id: number): Promise<{
  message:             string;
  pdf_path:            string;
  docx_path:           string;
  status:              string;
  draft_generated_at?: string | Date; // ✅ NEW
}> {
  return fetchApi(`${INQUIRIES_API_BASE}/inquiries/${id}/generate-draft`, {
    method: 'PATCH',
  });
}

// ─── PATCH confirm draft ─────────────────────────────────────────────────────
export async function confirmDraft(id: number): Promise<Inquiry> {
  return fetchApi<Inquiry>(`${INQUIRIES_API_BASE}/inquiries/${id}/confirm`, {
    method: 'PATCH',
  });
}

// ─── PATCH request changes ───────────────────────────────────────────────────
export async function requestChanges(
  id:    number,
  notes: string,
): Promise<Inquiry> {
  return fetchApi<Inquiry>(
    `${INQUIRIES_API_BASE}/inquiries/${id}/request-changes`,
    {
      method: 'PATCH',
      body:   JSON.stringify({ notes }),
    },
  );
}

// ═════════════════════════════════════════════════════════════════════════════
// ✅ Helper: build cache-bust suffix from draft_generated_at timestamp
// Used so regenerated drafts bypass browser/proxy cache.
// Falls back to Date.now() if no timestamp is provided.
// ═════════════════════════════════════════════════════════════════════════════
function buildCacheBust(draftGeneratedAt?: string | Date | null): string {
  if (draftGeneratedAt) {
    const ts =
      draftGeneratedAt instanceof Date
        ? draftGeneratedAt.getTime()
        : new Date(draftGeneratedAt).getTime();
    if (!isNaN(ts)) return `?v=${ts}`;
  }
  return `?v=${Date.now()}`;
}

// ─── Download draft PDF URL ──────────────────────────────────────────────────
// ✅ UPDATED — appends ?v=<timestamp> so each new generation gets a fresh URL
// Pass row.draft_generated_at from the inquiry/row to use the stable backend timestamp.
// If omitted, falls back to Date.now() (still works, but URL changes every render).
export function getDraftPdfUrl(
  id: number,
  draftGeneratedAt?: string | Date | null,
): string {
  return `${INQUIRIES_API_BASE}/inquiries/${id}/download-draft/pdf${buildCacheBust(draftGeneratedAt)}`;
}

// ─── Download draft DOCX URL ─────────────────────────────────────────────────
// ✅ UPDATED — same cache-busting pattern as PDF
export function getDraftDocxUrl(
  id: number,
  draftGeneratedAt?: string | Date | null,
): string {
  return `${INQUIRIES_API_BASE}/inquiries/${id}/download-draft/docx${buildCacheBust(draftGeneratedAt)}`;
}

// ─── DELETE ──────────────────────────────────────────────────────────────────
export async function deleteInquiry(id: number): Promise<void> {
  return fetchApi<void>(`${INQUIRIES_API_BASE}/inquiries/${id}`, {
    method: 'DELETE',
  });
}


export async function getPipelineSummary(): Promise<Record<string, number>> {
  return fetchApi<Record<string, number>>(
    `${INQUIRIES_API_BASE}/inquiries/pipeline-summary`,
  );
}