import { API_ENDPOINTS } from '@/shared/constants/apiEndpoints';
import { api } from '@/shared/utils/api';
import {
  type AssignableUser,
  type TicketFormOptions,
  isAssignableUserList,
  isTicketFormOptions,
} from '@/features/tickets/types/ticketForm.types';

export async function fetchDepartmentAssignableUsers(
  departmentId: string,
  search = '',
): Promise<AssignableUser[]> {
  const params = new URLSearchParams();
  if (search.trim()) {
    params.set('search', search.trim());
  }
  const query = params.toString();
  const raw: unknown = await api.get(
    `${API_ENDPOINTS.DEPARTMENTS.ASSIGNABLE_USERS(departmentId)}${query ? `?${query}` : ''}`,
  );

  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isAssignableUserList(data)) {
      return data;
    }
  }

  if (isAssignableUserList(raw)) {
    return raw;
  }

  throw new Error('Invalid department assignable users response');
}

export async function fetchDepartmentCollaboratorUsers(
  departmentId: string,
  search = '',
  excludeTicketId?: string,
): Promise<AssignableUser[]> {
  const params = new URLSearchParams();
  if (search.trim()) {
    params.set('search', search.trim());
  }
  if (excludeTicketId) {
    params.set('exclude_ticket_id', excludeTicketId);
  }
  const query = params.toString();
  const raw: unknown = await api.get(
    `${API_ENDPOINTS.DEPARTMENTS.COLLABORATOR_USERS(departmentId)}${query ? `?${query}` : ''}`,
  );

  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isAssignableUserList(data)) {
      return data;
    }
  }

  if (isAssignableUserList(raw)) {
    return raw;
  }

  throw new Error('Invalid department collaborator users response');
}

/** @deprecated Use fetchDepartmentAssignableUsers */
export async function fetchDepartmentAgents(
  departmentId: string,
  search = '',
): Promise<AssignableUser[]> {
  return fetchDepartmentAssignableUsers(departmentId, search);
}

export async function fetchTicketFormOptions(departmentId: string): Promise<TicketFormOptions> {
  const raw: unknown = await api.get(API_ENDPOINTS.DEPARTMENTS.TICKET_FORM_OPTIONS(departmentId));

  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isTicketFormOptions(data)) {
      return data;
    }
  }

  if (isTicketFormOptions(raw)) {
    return raw;
  }

  throw new Error('Invalid ticket form options response');
}
