import { api } from "@/src/lib/api/client";

// ─── Types ───────────────────────────────────────────────────

export type MailInboxConfig = {
  id: number;
  imap_host: string;
  imap_port: number;
  imap_user: string;
  imap_password_set: boolean;
  use_ssl: boolean;
  mailbox: string;
  is_active: boolean;
  last_polled_at: string | null;
  last_error: string;
  updated_at: string;
} | null;

export type MailImapPayload = {
  imap_host: string;
  imap_port: number;
  imap_user: string;
  imap_password?: string;
  use_ssl: boolean;
  mailbox: string;
  is_active: boolean;
};

export type MailSource = {
  id: number;
  client_name: string;
  email_or_domain: string;
  is_domain: boolean;
  notes: string;
  is_active: boolean;
  created_at: string;
  updated_at: string;
};

export type CreateMailSourcePayload = {
  client_name?: string;
  email_or_domain: string;
  notes?: string;
  is_active?: boolean;
};

export type UpdateMailSourcePayload = Partial<CreateMailSourcePayload>;

export type IncomingMailSummary = {
  id: number;
  from_email: string;
  from_name: string;
  subject: string;
  received_at: string;
  status: "pending" | "dispatched" | "processed" | "rejected";
  mail_source: { id: number; client_name: string; email_or_domain: string } | null;
  assigned_to: { id: number; name: string } | null;
  assigned_country: string;
  attachments_count: number;
};

export type IncomingMailAttachment = {
  id: number;
  filename: string;
  content_type: string;
  size: number;
  url: string | null;
  download_url: string;
};

export type IncomingMailDetail = IncomingMailSummary & {
  body_text: string;
  body_html: string;
  dispatch_note: string;
  dispatched_at: string | null;
  dispatched_by: { id: number; name: string } | null;
  accepted_at: string | null;
  accepted_by: { id: number; name: string } | null;
  case: number | null;
  attachments: IncomingMailAttachment[];
};

export type MailInboxResponse = {
  count: number;
  page: number;
  page_size: number;
  is_admin: boolean;
  results: IncomingMailSummary[];
  stats: {
    total: number;
    pending: number;
    dispatched: number;
    processed: number;
    rejected: number;
  };
};

export type CountryManager = {
  id: number;
  username: string;
  full_name: string;
  email: string;
};

export type DispatchPayload = {
  assigned_to_id: number;
  assigned_country?: string;
  dispatch_note?: string;
};

// ─── IMAP Config ─────────────────────────────────────────────

export async function getMailImapConfig(): Promise<MailInboxConfig> {
  return api.request<MailInboxConfig>("/tenant/mail/imap/", { method: "GET" });
}

export async function saveMailImapConfig(payload: MailImapPayload): Promise<MailInboxConfig> {
  return api.request<MailInboxConfig>("/tenant/mail/imap/", {
    method: "PUT",
    body: JSON.stringify(payload),
  });
}

export async function testMailImapConfig(
  payload: MailImapPayload & { imap_password: string }
): Promise<{ success: boolean; message: string }> {
  return api.request("/tenant/mail/imap/test/", {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

export async function pollMailNow(): Promise<{ success: boolean; last_polled_at: string | null; last_error: string }> {
  return api.request("/tenant/mail/imap/poll/", { method: "POST" });
}

// ─── Sources ─────────────────────────────────────────────────

export async function listMailSources(): Promise<MailSource[]> {
  return api.request<MailSource[]>("/tenant/mail/sources/", { method: "GET" });
}

export async function createMailSource(payload: CreateMailSourcePayload): Promise<MailSource> {
  return api.request<MailSource>("/tenant/mail/sources/", {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

export async function updateMailSource(id: number, payload: UpdateMailSourcePayload): Promise<MailSource> {
  return api.request<MailSource>(`/tenant/mail/sources/${id}/`, {
    method: "PATCH",
    body: JSON.stringify(payload),
  });
}

export async function deleteMailSource(id: number): Promise<void> {
  await api.request(`/tenant/mail/sources/${id}/`, { method: "DELETE" });
}

export async function toggleMailSource(id: number): Promise<MailSource> {
  return api.request<MailSource>(`/tenant/mail/sources/${id}/toggle/`, { method: "POST" });
}

// ─── Inbox ───────────────────────────────────────────────────

export async function listMailInbox(params?: {
  status?: string;
  search?: string;
  country?: string;
  page?: number;
}): Promise<MailInboxResponse> {
  const qs = new URLSearchParams();
  if (params?.status) qs.set("status", params.status);
  if (params?.search) qs.set("search", params.search);
  if (params?.country) qs.set("country", params.country);
  if (params?.page) qs.set("page", String(params.page));
  const query = qs.toString() ? `?${qs}` : "";
  return api.request<MailInboxResponse>(`/tenant/mail/inbox/${query}`, { method: "GET" });
}

export async function getMailDetail(id: number): Promise<IncomingMailDetail> {
  return api.request<IncomingMailDetail>(`/tenant/mail/inbox/${id}/`, { method: "GET" });
}

export async function dispatchMail(id: number, payload: DispatchPayload): Promise<IncomingMailDetail> {
  return api.request<IncomingMailDetail>(`/tenant/mail/inbox/${id}/dispatch/`, {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

export async function rejectMail(id: number): Promise<IncomingMailSummary> {
  return api.request<IncomingMailSummary>(`/tenant/mail/inbox/${id}/reject/`, { method: "POST" });
}

export async function restoreMail(id: number): Promise<IncomingMailSummary> {
  return api.request<IncomingMailSummary>(`/tenant/mail/inbox/${id}/restore/`, { method: "POST" });
}

export async function markMailProcessed(id: number): Promise<IncomingMailSummary> {
  return api.request<IncomingMailSummary>(`/tenant/mail/inbox/${id}/processed/`, { method: "POST" });
}

export async function selfDispatchMail(id: number, dispatch_note?: string): Promise<IncomingMailDetail> {
  return api.request<IncomingMailDetail>(`/tenant/mail/inbox/${id}/self-dispatch/`, {
    method: "POST",
    body: JSON.stringify({ dispatch_note: dispatch_note ?? "" }),
  });
}

export async function acceptMail(id: number): Promise<IncomingMailDetail> {
  return api.request<IncomingMailDetail>(`/tenant/mail/inbox/${id}/accept/`, { method: "POST" });
}

export async function reassignMail(
  id: number,
  payload: { assigned_to_id: number; dispatch_note?: string }
): Promise<IncomingMailDetail> {
  return api.request<IncomingMailDetail>(`/tenant/mail/inbox/${id}/reassign/`, {
    method: "POST",
    body: JSON.stringify(payload),
  });
}

export type MailInboxStats = { pending: number; dispatched: number; processed: number; rejected: number };

export async function getMailInboxStats(): Promise<MailInboxStats> {
  return api.request<MailInboxStats>("/tenant/mail/inbox/stats/", { method: "GET" });
}

export async function downloadMailAttachment(id: number): Promise<Blob> {
  const { fetchBlob } = await import("./client");
  return fetchBlob(`/tenant/mail/attachments/${id}/download/`);
}

// ─── Responsables Pays ───────────────────────────────────────

export async function listCountryManagers(): Promise<CountryManager[]> {
  return api.request<CountryManager[]>("/tenant/mail/country-managers/", { method: "GET" });
}

// ─── Cron Status ─────────────────────────────────────────────

export type CronHealth = "healthy" | "delayed" | "stale" | "inactive" | "unconfigured" | "error";

export type CronStatus = {
  health: CronHealth;
  health_label: string;
  is_active: boolean;
  last_run: string | null;
  last_error: string;
  minutes_since_last_run: number | null;
  cron_interval_minutes: number;
};

export async function getMailCronStatus(): Promise<CronStatus> {
  return api.request<CronStatus>("/tenant/mail/imap/status/", { method: "GET" });
}
