import { apiRequest } from "@/services/apiClient";

export interface MailSettings {
  enabled: boolean;
  from_name: string;
  from_address: string;
  host: string;
  port: number;
  username: string;
  password: string;
  password_configured?: boolean;
  encryption: "ssl" | "tls" | "none";
  timeout: number;
  reply_to: string;
  admin_email: string;
  password_reset_expire_minutes: number;
  connection_status?: "connected" | "error" | "unknown";
  connection_message?: string;
  connection_checked_at?: string | null;
  source?: string;
}

export interface EmailTemplateListItem {
  id: number;
  slug: string;
  name: string;
  subject: string;
  category: string;
  is_active: boolean;
  is_system: boolean;
  available_variables: string[];
  updated_at?: string;
}

export interface EmailTemplateDetail extends EmailTemplateListItem {
  html_body: string;
  text_body?: string | null;
}

export interface EmailLogItem {
  id: number;
  event: string;
  template_slug: string | null;
  recipient: string;
  subject: string | null;
  status: "queued" | "sent" | "failed";
  error_message: string | null;
  sent_at: string | null;
  created_at: string;
}

export const adminMailService = {
  getSettings(token: string) {
    return apiRequest<MailSettings>("/admin/mail-settings", { token });
  },

  updateSettings(token: string, payload: Partial<MailSettings> & { password?: string }) {
    return apiRequest<MailSettings>("/admin/mail-settings", {
      method: "PUT",
      token,
      body: payload,
    });
  },

  testConnection(token: string, payload?: Partial<MailSettings> & { password?: string }) {
    return apiRequest<{ status: string }>("/admin/mail-settings/test-connection", {
      method: "POST",
      token,
      body: payload ?? {},
    });
  },

  sendTest(token: string, recipient: string, payload?: Partial<MailSettings> & { password?: string }) {
    return apiRequest<{ log_id?: number }>("/admin/mail-settings/send-test", {
      method: "POST",
      token,
      body: { recipient, ...payload },
    });
  },

  listTemplates(token: string) {
    return apiRequest<EmailTemplateListItem[]>("/admin/email-templates", { token });
  },

  getTemplate(token: string, slug: string) {
    return apiRequest<EmailTemplateDetail>(`/admin/email-templates/${slug}`, { token });
  },

  updateTemplate(
    token: string,
    slug: string,
    payload: Partial<Pick<EmailTemplateDetail, "name" | "subject" | "html_body" | "text_body" | "is_active">>,
  ) {
    return apiRequest<EmailTemplateDetail>(`/admin/email-templates/${slug}`, {
      method: "PUT",
      token,
      body: payload,
    });
  },

  restoreTemplate(token: string, slug: string) {
    return apiRequest<EmailTemplateDetail>(`/admin/email-templates/${slug}/restore`, {
      method: "POST",
      token,
    });
  },

  duplicateTemplate(token: string, slug: string) {
    return apiRequest<EmailTemplateDetail>(`/admin/email-templates/${slug}/duplicate`, {
      method: "POST",
      token,
    });
  },

  previewTemplate(token: string, slug: string, variables?: Record<string, string>) {
    return apiRequest<{ subject: string; html: string }>(`/admin/email-templates/${slug}/preview`, {
      method: "POST",
      token,
      body: { variables: variables ?? {} },
    });
  },

  listLogs(
    token: string,
    params?: { status?: string; recipient?: string; page?: number },
  ) {
    const q = new URLSearchParams();
    if (params?.status) q.set("status", params.status);
    if (params?.recipient) q.set("recipient", params.recipient);
    if (params?.page) q.set("page", String(params.page));
    const qs = q.toString();

    return apiRequest<EmailLogItem[]>(`/admin/email-logs${qs ? `?${qs}` : ""}`, { token });
  },

  resendLog(token: string, id: number) {
    return apiRequest<EmailLogItem>(`/admin/email-logs/${id}/resend`, {
      method: "POST",
      token,
    });
  },
};
