import { apiRequest } from "@/services/apiClient";
import type { ApiPaginatedResponse } from "@/types";
import {
  defaultPeriodSelection,
  formatDateApi,
  selectionToRange,
  type DashboardPeriodSelection,
} from "@/lib/dashboardPeriod";
import type { DashboardOverview } from "@/types/adminDashboard";
import type { SalesReport } from "@/types/adminSalesReport";

export type DashboardOverviewLegacy = {
  stats: {
    clients: number;
    companies: number;
    apps: number;
    openTickets: number;
    revenueMonth: number;
    mrr: number;
  };
  recentQuotes: DashboardOverview["recentQuotes"];
  ticketsByDay: { day: string; total: number }[];
};

export type DashboardClientRow = {
  id: number;
  name: string;
  email: string;
  avatar?: string | null;
  company: string;
  plan: string;
  status: string;
  role: string;
};

export type DashboardFinance = {
  revenueTotal: number;
  mrr: number;
  pending: number;
};

function formatBrl(value: number) {
  return value.toLocaleString("pt-BR", { style: "currency", currency: "BRL" });
}

export const adminDashboardService = {
  overview(token: string, selection: DashboardPeriodSelection = defaultPeriodSelection()) {
    const range = selectionToRange(selection);
    const qs = new URLSearchParams({
      from: formatDateApi(range.from),
      to: formatDateApi(range.to),
    });
    if (selection.mode === "preset") {
      qs.set("period", selection.preset);
    } else {
      qs.set("period", "custom");
    }
    return apiRequest<DashboardOverview>(`/admin/dashboard/overview?${qs.toString()}`, {
      token,
    });
  },

  salesReport(token: string, selection: DashboardPeriodSelection = defaultPeriodSelection()) {
    const range = selectionToRange(selection);
    const qs = new URLSearchParams({
      from: formatDateApi(range.from),
      to: formatDateApi(range.to),
    });
    if (selection.mode === "preset") {
      qs.set("period", selection.preset);
    } else {
      qs.set("period", "custom");
    }
    return apiRequest<SalesReport>(`/admin/dashboard/sales-report?${qs.toString()}`, {
      token,
    });
  },

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

  finance(token: string) {
    return apiRequest<DashboardFinance>("/admin/dashboard/finance", { token });
  },

  formatBrl,
};
