import { apiFetch } from "@/lib/api/server";
import type {
  EventTheme,
  PaginatedResponse,
  KolaboraEvent,
  TicketType,
  SignatureProfile,
  SignatureArtist,
  SignatureBrandPartner,
} from "@/types/event";
import type { PetugasAssignment } from "@/types/organizer";
import type { Promo, Voucher } from "@/types/promo-voucher";
import type { AuthUser } from "@/types/user";
import type {
  AdminDashboardSummary,
  ActivityLogEntry,
  ErrorLogEntry,
  ErrorLogDetail,
  AdminPaymentEntry,
  AdminCheckinEntry,
} from "@/types/admin";
import type {
  AttendanceAnalytics,
  EventPerformanceAnalytics,
  ParticipantAnalytics,
  RevenueAnalytics,
  TicketSalesAnalytics,
} from "@/types/analytics";
import type {
  ContactSettings,
  EmailSettings,
  GeneralSettings,
  LegalSettings,
} from "@/types/settings";
import type { TrashListResponse } from "@/types/retention";
import type { Announcement, Banner, CmsPage, Faq, HomepageSection } from "@/types/cms";

/** GET /admin/dashboard — FR-084. */
export async function getAdminDashboard() {
  return apiFetch<{ data: AdminDashboardSummary }>("/admin/dashboard", { auth: true });
}

/** GET /admin/users — FR-085. */
export async function getUsers(params: { role?: string; page?: number; official?: boolean } = {}) {
  const query = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value !== undefined && value !== "") query.set(key, String(value));
  }
  const qs = query.toString();
  return apiFetch<PaginatedResponse<AuthUser>>(`/admin/users${qs ? `?${qs}` : ""}`, { auth: true });
}

/** GET /admin/events — FR-089. Pass `signature: true` for the Signature Events admin area (`/admin/signature/events`). */
export async function getAdminEvents(params: { status?: string; page?: number; signature?: boolean } = {}) {
  const query = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value !== undefined && value !== "") query.set(key, String(value));
  }
  const qs = query.toString();
  return apiFetch<PaginatedResponse<KolaboraEvent>>(`/admin/events${qs ? `?${qs}` : ""}`, { auth: true });
}

/** GET /admin/events/{id}. */
export async function getAdminEvent(id: number | string) {
  return apiFetch<{ data: KolaboraEvent }>(`/admin/events/${id}`, { auth: true });
}

/** GET /admin/events/{id}/ticket-types — FR-039. */
export async function getAdminEventTicketTypes(eventId: number | string) {
  return apiFetch<{ data: TicketType[] }>(`/admin/events/${eventId}/ticket-types`, { auth: true });
}

/** GET /admin/events/{id}/petugas. */
export async function getAdminEventPetugas(eventId: number | string) {
  return apiFetch<{ data: PetugasAssignment[] }>(`/admin/events/${eventId}/petugas`, { auth: true });
}

/** GET /admin/events/{id}/promos — FR-050/054/056. */
export async function getAdminEventPromos(eventId: number | string) {
  return apiFetch<{ data: Promo[] }>(`/admin/events/${eventId}/promos`, { auth: true });
}

/** GET /admin/events/{id}/vouchers — FR-051/055/057. */
export async function getAdminEventVouchers(eventId: number | string) {
  return apiFetch<{ data: Voucher[] }>(`/admin/events/${eventId}/vouchers`, { auth: true });
}

/** GET /admin/events/{id}/theme — FR-SIG-004. */
export async function getAdminEventTheme(eventId: number | string) {
  return apiFetch<{ data: EventTheme | null }>(`/admin/events/${eventId}/theme`, { auth: true });
}

/**
 * GET /admin/events/signature — the Kolabora Official event to manage on the
 * admin "Signature" nav page, any status (not just Published/Ongoing).
 */
export async function getAdminSignatureEvent() {
  return apiFetch<{ data: KolaboraEvent | null }>(`/admin/events/signature`, { auth: true });
}

/** GET /admin/events/{id}/signature-profile — Signature Event dedicated page content. */
export async function getAdminEventSignatureProfile(eventId: number | string) {
  return apiFetch<{ data: SignatureProfile | null }>(`/admin/events/${eventId}/signature-profile`, { auth: true });
}

/** GET /admin/events/{id}/signature-artists — Signature Event Lineup Artis. */
export async function getAdminEventSignatureArtists(eventId: number | string) {
  return apiFetch<{ data: SignatureArtist[] }>(`/admin/events/${eventId}/signature-artists`, { auth: true });
}

/** GET /admin/events/{id}/signature-brand-partners — Signature Event Brand partners. */
export async function getAdminEventSignatureBrandPartners(eventId: number | string) {
  return apiFetch<{ data: SignatureBrandPartner[] }>(`/admin/events/${eventId}/signature-brand-partners`, {
    auth: true,
  });
}

/** GET /admin/audit-log — FR-107. */
export async function getAuditLog(params: { role_context?: string; page?: number } = {}) {
  const query = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value !== undefined && value !== "") query.set(key, String(value));
  }
  const qs = query.toString();
  return apiFetch<PaginatedResponse<ActivityLogEntry>>(`/admin/audit-log${qs ? `?${qs}` : ""}`, {
    auth: true,
  });
}

export interface AnalyticsDateRange {
  start_date?: string;
  end_date?: string;
}

function dateRangeQuery(range?: AnalyticsDateRange) {
  if (!range?.start_date || !range?.end_date) return "";
  return `?start_date=${range.start_date}&end_date=${range.end_date}`;
}

/**
 * GET /admin/analytics/revenue — FR-095, platform-wide (BR-030).
 * `start_date`/`end_date` are sent on every call below for the redesigned
 * /admin/analytics dashboard's date-range filter, but as of this writing the
 * backend controllers for revenue/ticket-sales/attendance/events/participants
 * analytics do not read or apply these params — they always return
 * all-time totals. The params are forwarded now so the frontend requires no
 * further changes once backend support is added; until then, switching the
 * date range in the UI will not change the numbers, and KPI deltas will
 * always show "flat" (current-period and previous-period responses are
 * identical). See documentation/audit for the corresponding note.
 */
export async function getAdminRevenueAnalytics(range?: AnalyticsDateRange) {
  return apiFetch<{ data: RevenueAnalytics }>(`/admin/analytics/revenue${dateRangeQuery(range)}`, {
    auth: true,
  });
}

/** GET /admin/analytics/ticket-sales — FR-096, platform-wide (BR-030). See date-range caveat above. */
export async function getAdminTicketSalesAnalytics(range?: AnalyticsDateRange) {
  return apiFetch<{ data: TicketSalesAnalytics }>(
    `/admin/analytics/ticket-sales${dateRangeQuery(range)}`,
    { auth: true },
  );
}

/** GET /admin/analytics/attendance — FR-102, platform-wide (BR-030). See date-range caveat above. */
export async function getAdminAttendanceAnalytics(range?: AnalyticsDateRange) {
  return apiFetch<{ data: AttendanceAnalytics }>(`/admin/analytics/attendance${dateRangeQuery(range)}`, {
    auth: true,
  });
}

/** GET /admin/analytics/events — FR-097, platform-wide (BR-030). See date-range caveat above. */
export async function getAdminEventPerformanceAnalytics(range?: AnalyticsDateRange) {
  return apiFetch<{ data: EventPerformanceAnalytics }>(
    `/admin/analytics/events${dateRangeQuery(range)}`,
    { auth: true },
  );
}

/** GET /admin/analytics/participants — FR-098, platform-wide (BR-030). See date-range caveat above. */
export async function getAdminParticipantAnalytics(range?: AnalyticsDateRange) {
  return apiFetch<{ data: ParticipantAnalytics }>(
    `/admin/analytics/participants${dateRangeQuery(range)}`,
    { auth: true },
  );
}

/** GET /admin/settings/general — FR-135/136. */
export async function getGeneralSettings() {
  return apiFetch<{ data: GeneralSettings }>("/admin/settings/general", { auth: true });
}

/** GET /admin/settings/contact — FR-137. */
export async function getContactSettings() {
  return apiFetch<{ data: ContactSettings }>("/admin/settings/contact", { auth: true });
}

/** GET /admin/settings/email — FR-138. */
export async function getEmailSettings() {
  return apiFetch<{ data: EmailSettings }>("/admin/settings/email", { auth: true });
}

/** GET /admin/settings/legal — FR-140/141. */
export async function getLegalSettings() {
  return apiFetch<{ data: LegalSettings }>("/admin/settings/legal", { auth: true });
}

/** GET /admin/trash — FR-RST-003. */
export async function getAdminTrash(type: string) {
  return apiFetch<TrashListResponse>(`/admin/trash?type=${type}`, { auth: true });
}

/** GET /admin/cms/pages — FR-CMS-001. */
export async function getCmsPages() {
  return apiFetch<PaginatedResponse<CmsPage>>("/admin/cms/pages", { auth: true });
}

/** GET /admin/cms/pages/{id} — FR-CMS-002. */
export async function getCmsPage(id: number | string) {
  return apiFetch<{ data: CmsPage }>(`/admin/cms/pages/${id}`, { auth: true });
}

/** GET /admin/cms/faqs — FR-CMS-009. */
export async function getAdminFaqs() {
  return apiFetch<{ data: Faq[] }>("/admin/cms/faqs", { auth: true });
}

/** GET /admin/cms/announcements — FR-CMS-013. */
export async function getAdminAnnouncements() {
  return apiFetch<{ data: Announcement[] }>("/admin/cms/announcements", { auth: true });
}

/** GET /admin/cms/banners — FR-CMS-008. */
export async function getAdminBanners() {
  return apiFetch<{ data: Banner[] }>("/admin/cms/banners", { auth: true });
}

/** GET /admin/cms/homepage-sections — FR-CMS-007/014, includes hidden sections. */
export async function getAdminHomepageSections() {
  return apiFetch<{ data: HomepageSection[] }>("/admin/cms/homepage-sections", { auth: true });
}

/** GET /admin/error-logs — FR-110. */
export async function getErrorLogs(page = 1) {
  return apiFetch<PaginatedResponse<ErrorLogEntry>>(`/admin/error-logs?page=${page}`, { auth: true });
}

/** GET /admin/error-logs/{id} — FR-110, includes full stack trace. */
export async function getErrorLog(id: number | string) {
  return apiFetch<{ data: ErrorLogDetail }>(`/admin/error-logs/${id}`, { auth: true });
}

/** GET /admin/payments — FR-091. */
export async function getAdminPayments(params: { status?: string; event_id?: string; page?: number } = {}) {
  const query = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value !== undefined && value !== "") query.set(key, String(value));
  }
  const qs = query.toString();
  return apiFetch<PaginatedResponse<AdminPaymentEntry>>(`/admin/payments${qs ? `?${qs}` : ""}`, {
    auth: true,
  });
}

/** GET /admin/checkins — FR-092. */
export async function getAdminCheckins(
  params: { event_id?: string; checkin_status?: string; page?: number } = {},
) {
  const query = new URLSearchParams();
  for (const [key, value] of Object.entries(params)) {
    if (value !== undefined && value !== "") query.set(key, String(value));
  }
  const qs = query.toString();
  return apiFetch<PaginatedResponse<AdminCheckinEntry>>(`/admin/checkins${qs ? `?${qs}` : ""}`, {
    auth: true,
  });
}
