import { useEffect, useMemo, useState } from 'react';
import { useQuery } from '@tanstack/react-query';
import { listDepartments } from '@/features/admin/services/departmentAdminService';
import { PERMISSIONS } from '@/features/auth/constants/permissions';
import { selectUserDepartments, useAuthStore } from '@/features/auth/store/authStore';
import type { Department } from '@/shared/types/api.types';

function mapAdminDepartments(
  records: Awaited<ReturnType<typeof listDepartments>>,
): Department[] {
  return records.map((department) => ({
    id: department.id,
    company_id: department.company_id,
    name: department.name,
    description: department.description ?? undefined,
    is_active: department.is_active,
    created_at: '',
    updated_at: '',
  }));
}

export function useSettingsDepartmentScope() {
  const user = useAuthStore((state) => state.user);
  const membershipDepartments = useAuthStore(selectUserDepartments);

  const canListCompanyDepartments = Boolean(
    user &&
      (user.is_super_admin ||
        user.permissions.includes(PERMISSIONS.COMPANY_DEPARTMENTS_MANAGE) ||
        user.permissions.includes(PERMISSIONS.COMPANY_SETTINGS_MANAGE)),
  );

  const shouldFetchDepartments =
    canListCompanyDepartments &&
    (membershipDepartments.length === 0 || Boolean(user?.is_super_admin));

  const companyDepartmentsQuery = useQuery({
    queryKey: ['settings', 'departments', user?.company_id, user?.is_super_admin],
    queryFn: () =>
      listDepartments(user?.is_super_admin ? undefined : { company_id: user!.company_id }),
    enabled: shouldFetchDepartments,
    staleTime: 60_000,
  });

  const departments = useMemo(() => {
    if (membershipDepartments.length > 0 && !user?.is_super_admin) {
      return membershipDepartments;
    }

    if (companyDepartmentsQuery.data && companyDepartmentsQuery.data.length > 0) {
      return mapAdminDepartments(companyDepartmentsQuery.data);
    }

    return membershipDepartments;
  }, [companyDepartmentsQuery.data, membershipDepartments, user?.is_super_admin]);

  const [departmentId, setDepartmentId] = useState('');

  useEffect(() => {
    if (!departmentId && departments[0]?.id) {
      setDepartmentId(departments[0].id);
    }
  }, [departmentId, departments]);

  const isLoadingDepartments = shouldFetchDepartments && companyDepartmentsQuery.isLoading;

  const needsDepartmentSelection = departments.length > 1;
  const isDepartmentContextReady =
    !isLoadingDepartments && departments.length > 0 && Boolean(departmentId);

  return {
    departments,
    departmentId,
    setDepartmentId,
    needsDepartmentSelection,
    isDepartmentContextReady,
    isLoadingDepartments,
  };
}
