import { apiRequest } from "@/services/apiClient";
import type { ApiPaginatedResponse } from "@/types";
import type {
  HelpAgentProfile,
  HelpAuditEntry,
  HelpAutomationRule,
  HelpClientRecord,
  HelpDeskDashboard,
  HelpDeskSettings,
  HelpTicketDetail,
  HelpTicketMessage,
  HelpTicketNote,
} from "@/types/helpDeskAdmin";
import type { HelpArticle, HelpCategory } from "@/types/help";

export type TicketListParams = {
  status?: string;
  priority?: string;
  assigned_to?: number;
  category?: string;
  search?: string;
  date_from?: string;
  date_to?: string;
  sort?: string;
  page?: number;
  per_page?: number;
};

export const helpDeskAdminService = {
  dashboard(token: string) {
    return apiRequest<HelpDeskDashboard>("/admin/help/analytics", { token });
  },

  listTickets(token: string, params?: TicketListParams) {
    const qs = new URLSearchParams();
    Object.entries(params ?? {}).forEach(([k, v]) => {
      if (v !== undefined && v !== "") qs.set(k, String(v));
    });
    const query = qs.toString();
    return apiRequest<HelpTicketDetail[]>(`/admin/help/tickets${query ? `?${query}` : ""}`, {
      token,
    }) as Promise<ApiPaginatedResponse<HelpTicketDetail>>;
  },

  getTicket(token: string, id: number) {
    return apiRequest<HelpTicketDetail>(`/admin/help/tickets/${id}`, { token });
  },

  updateTicket(
    token: string,
    id: number,
    body: {
      status?: string;
      priority?: string;
      assigned_to?: number | null;
      tag_ids?: number[];
    },
  ) {
    return apiRequest<HelpTicketDetail>(`/admin/help/tickets/${id}`, {
      method: "PUT",
      token,
      body,
    });
  },

  assumeTicket(token: string, id: number) {
    return apiRequest<HelpTicketDetail>(`/admin/help/tickets/${id}/assume`, {
      method: "POST",
      token,
    });
  },

  replyTicket(
    token: string,
    id: number,
    body: { message: string; attachments?: { url: string; name?: string; mime?: string }[] },
  ) {
    return apiRequest<HelpTicketMessage>(`/admin/help/tickets/${id}/reply`, {
      method: "POST",
      token,
      body,
    });
  },

  addNote(token: string, id: number, body: { body: string; is_internal?: boolean }) {
    return apiRequest<HelpTicketNote>(`/admin/help/tickets/${id}/notes`, {
      method: "POST",
      token,
      body,
    });
  },

  listClients(token: string, search?: string) {
    const q = search ? `?search=${encodeURIComponent(search)}` : "";
    return apiRequest<HelpClientRecord[]>(`/admin/help/clients${q}`, { token }) as Promise<
      ApiPaginatedResponse<HelpClientRecord>
    >;
  },

  listAgents(token: string) {
    return apiRequest<{ agents: HelpAgentProfile[]; availableUsers: { id: number; name: string; email: string }[] }>(
      "/admin/help/agents",
      { token },
    );
  },

  saveAgent(token: string, body: { user_id: number; help_role: string; is_online?: boolean }) {
    return apiRequest<HelpAgentProfile>("/admin/help/agents", { method: "POST", token, body });
  },

  updateAgent(token: string, id: number, body: { help_role?: string; is_online?: boolean }) {
    return apiRequest<HelpAgentProfile>(`/admin/help/agents/${id}`, { method: "PUT", token, body });
  },

  deleteAgent(token: string, id: number) {
    return apiRequest<null>(`/admin/help/agents/${id}`, { method: "DELETE", token });
  },

  listAutomations(token: string) {
    return apiRequest<HelpAutomationRule[]>("/admin/help/automations", { token });
  },

  getSettings(token: string) {
    return apiRequest<HelpDeskSettings>("/admin/help/settings", { token });
  },

  saveSettings(token: string, settings: Record<string, unknown>) {
    return apiRequest<null>("/admin/help/settings", { method: "PUT", token, body: { settings } });
  },

  listAudit(token: string, page = 1) {
    return apiRequest<HelpAuditEntry[]>(`/admin/help/audit?page=${page}`, { token }) as Promise<
      ApiPaginatedResponse<HelpAuditEntry>
    >;
  },

  listArticles(token: string, params?: { search?: string; status?: string; page?: number }) {
    const qs = new URLSearchParams();
    if (params?.search) qs.set("search", params.search);
    if (params?.status) qs.set("status", params.status);
    if (params?.page) qs.set("page", String(params.page));
    const query = qs.toString();
    return apiRequest<HelpArticle[]>(`/admin/help/articles${query ? `?${query}` : ""}`, {
      token,
    }) as Promise<ApiPaginatedResponse<HelpArticle>>;
  },

  listCategories(token: string) {
    return apiRequest<HelpCategory[]>("/admin/help/categories", { token });
  },
};
