import { API_ENDPOINTS } from '@/shared/constants/apiEndpoints';
import { api } from '@/shared/utils/api';
import { isPaginatedResponse } from '@/shared/types/pagination.types';
import type { UserRecord } from '@/features/admin/types/admin.types';

function isUserRecord(value: unknown): value is UserRecord {
  if (typeof value !== 'object' || value === null) {
    return false;
  }
  const u = value as Record<string, unknown>;
  return typeof u.id === 'string' && typeof u.email === 'string';
}

function unwrapList(raw: unknown): UserRecord[] {
  if (isPaginatedResponse(raw, isUserRecord)) {
    return raw.data;
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (Array.isArray(data) && data.every(isUserRecord)) {
      return data;
    }
  }
  return [];
}

function unwrapOne(raw: unknown): UserRecord {
  if (isUserRecord(raw)) {
    return raw;
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw) {
    const data = (raw as { data: unknown }).data;
    if (isUserRecord(data)) {
      return data;
    }
  }
  throw new Error('Invalid user response');
}

export async function listUsers(params?: {
  company_id?: string;
  department_id?: string;
  search?: string;
  is_active?: boolean;
}): Promise<UserRecord[]> {
  const query = new URLSearchParams();
  if (params?.company_id) {
    query.set('company_id', params.company_id);
  }
  if (params?.department_id) {
    query.set('department_id', params.department_id);
  }
  if (params?.search) {
    query.set('search', params.search);
  }
  if (params?.is_active !== undefined) {
    query.set('is_active', params.is_active ? '1' : '0');
  }
  const suffix = query.toString() ? `?${query.toString()}` : '';
  const raw: unknown = await api.get(`${API_ENDPOINTS.USERS.LIST}${suffix}`);
  return unwrapList(raw);
}

export async function updateUser(
  id: string,
  payload: Partial<{
    name: string;
    is_active: boolean;
    locale: string;
    timezone: string;
    role_names: string[];
    departments: { id: string; role: string; is_manager?: boolean }[];
  }>,
): Promise<UserRecord> {
  const raw: unknown = await api.patch(API_ENDPOINTS.USERS.UPDATE(id), payload);
  return unwrapOne(raw);
}

export async function deleteUser(id: string): Promise<void> {
  await api.delete(API_ENDPOINTS.USERS.DELETE(id));
}
