import { API_ENDPOINTS } from '@/shared/constants/apiEndpoints';
import { api } from '@/shared/utils/api';
import {
  isPaginatedResponse,
  type PaginatedResponse,
} from '@/shared/types/pagination.types';
import {
  isTicketSummary,
  type TicketSummary,
} from '@/features/tickets/types/ticket.types';
import {
  type CreatePortalTicketPayload,
  type DepartmentPortalMetadata,
  isDepartmentPortalMetadata,
  type PortalTicketFilters,
} from '@/features/departmentPortal/types/departmentPortal.types';

function buildQuery(filters: PortalTicketFilters): string {
  const params = new URLSearchParams();
  if (filters.page) params.set('page', String(filters.page));
  if (filters.per_page) params.set('per_page', String(filters.per_page));
  if (filters.search) params.set('search', filters.search);
  if (filters.status_id) params.set('status_id', filters.status_id);
  if (filters.priority_id) params.set('priority_id', filters.priority_id);
  if (filters.category_id) params.set('category_id', filters.category_id);
  if (filters.date_from) params.set('date_from', filters.date_from);
  if (filters.date_to) params.set('date_to', filters.date_to);
  if (filters.department_id) params.set('department_id', filters.department_id);
  const query = params.toString();
  return query ? `?${query}` : '';
}

export async function fetchDepartmentPortal(slug: string): Promise<DepartmentPortalMetadata> {
  const raw: unknown = await api.get(API_ENDPOINTS.DEPARTMENT_PORTAL.SHOW(slug));
  const data = (raw as { data?: unknown })?.data ?? raw;
  if (!isDepartmentPortalMetadata(data)) {
    throw new Error('Invalid department portal response');
  }
  return data;
}

export async function createDepartmentPortalTicket(
  slug: string,
  payload: CreatePortalTicketPayload,
): Promise<TicketSummary> {
  const raw: unknown = await api.post(API_ENDPOINTS.DEPARTMENT_PORTAL.CREATE_TICKET(slug), payload);
  const data = (raw as { data?: unknown })?.data ?? raw;
  if (!isTicketSummary(data)) {
    throw new Error('Invalid create ticket response');
  }
  return data;
}

export async function fetchDepartmentPortalMyTickets(
  slug: string,
  filters: PortalTicketFilters = {},
): Promise<PaginatedResponse<TicketSummary>> {
  const raw: unknown = await api.get(
    `${API_ENDPOINTS.DEPARTMENT_PORTAL.MY_TICKETS(slug)}${buildQuery(filters)}`,
  );
  if (!isPaginatedResponse(raw, isTicketSummary)) {
    throw new Error('Invalid portal my tickets response');
  }
  return raw;
}

export async function fetchProfileMyTickets(
  filters: PortalTicketFilters = {},
): Promise<PaginatedResponse<TicketSummary>> {
  const raw: unknown = await api.get(
    `${API_ENDPOINTS.PROFILE.MY_TICKETS}${buildQuery(filters)}`,
  );
  if (!isPaginatedResponse(raw, isTicketSummary)) {
    throw new Error('Invalid profile my tickets response');
  }
  return raw;
}
