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

export interface DepartmentMembership {
  id: string;
  department_id: string;
  user_id: string;
  role: string;
  role_in_department: string;
  is_manager: boolean;
  is_department_head: boolean;
  is_primary: boolean;
  joined_at: string | null;
  department?: {
    id: string;
    name: string;
    code: string;
    company_id: string;
  };
  user?: {
    id: string;
    name: string;
    email: string;
    is_active: boolean;
  };
}

function unwrapMembershipList(raw: unknown): DepartmentMembership[] {
  if (isPaginatedResponse(raw, (v): v is DepartmentMembership => typeof v === 'object' && v !== null)) {
    return raw.data as DepartmentMembership[];
  }
  if (typeof raw === 'object' && raw !== null && 'data' in raw && Array.isArray((raw as { data: unknown }).data)) {
    return (raw as { data: DepartmentMembership[] }).data;
  }
  return [];
}

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

export async function listUserDepartments(userId: string): Promise<DepartmentMembership[]> {
  const raw: unknown = await api.get(API_ENDPOINTS.USERS.DEPARTMENTS(userId));
  return unwrapMembershipList(raw);
}

export async function assignUserDepartment(
  userId: string,
  payload: {
    department_id: string;
    is_primary?: boolean;
    is_department_head?: boolean;
    role?: string;
  },
): Promise<DepartmentMembership> {
  const raw: unknown = await api.post(API_ENDPOINTS.USERS.DEPARTMENTS(userId), payload);
  return unwrapMembership(raw);
}

export async function updateUserDepartment(
  userId: string,
  departmentId: string,
  payload: {
    is_primary?: boolean;
    is_department_head?: boolean;
    role?: string;
  },
): Promise<DepartmentMembership> {
  const raw: unknown = await api.patch(
    API_ENDPOINTS.USERS.DEPARTMENT(userId, departmentId),
    payload,
  );
  return unwrapMembership(raw);
}

export async function removeUserDepartment(userId: string, departmentId: string): Promise<void> {
  await api.delete(API_ENDPOINTS.USERS.DEPARTMENT(userId, departmentId));
}

export async function listDepartmentUsers(departmentId: string): Promise<DepartmentMembership[]> {
  const raw: unknown = await api.get(API_ENDPOINTS.DEPARTMENTS_ADMIN.USERS(departmentId));
  return unwrapMembershipList(raw);
}

export async function assignDepartmentUser(
  departmentId: string,
  payload: {
    user_id: string;
    is_primary?: boolean;
    is_department_head?: boolean;
    role?: string;
  },
): Promise<DepartmentMembership> {
  const raw: unknown = await api.post(API_ENDPOINTS.DEPARTMENTS_ADMIN.USERS(departmentId), payload);
  return unwrapMembership(raw);
}

export async function removeDepartmentUser(departmentId: string, userId: string): Promise<void> {
  await api.delete(API_ENDPOINTS.DEPARTMENTS_ADMIN.USER(departmentId, userId));
}

export async function listDepartmentHeads(departmentId: string): Promise<DepartmentMembership[]> {
  const raw: unknown = await api.get(API_ENDPOINTS.DEPARTMENTS_ADMIN.HEADS(departmentId));
  return unwrapMembershipList(raw);
}

export async function assignDepartmentHead(
  departmentId: string,
  userId: string,
): Promise<DepartmentMembership> {
  const raw: unknown = await api.post(API_ENDPOINTS.DEPARTMENTS_ADMIN.HEADS(departmentId), {
    user_id: userId,
  });
  return unwrapMembership(raw);
}

export async function removeDepartmentHead(departmentId: string, userId: string): Promise<void> {
  await api.delete(API_ENDPOINTS.DEPARTMENTS_ADMIN.HEAD(departmentId, userId));
}
