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

function mapDepartmentRecords(records: DepartmentRecord[]): Department[] {
  return records
    .filter((department) => department.is_active)
    .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 useTicketDepartments() {
  const user = useAuthStore((state) => state.user);
  const membershipDepartments = useAuthStore(selectUserDepartments);
  const [companyId, setCompanyId] = useState('');
  const [departmentId, setDepartmentId] = useState('');

  const isSuperAdmin = Boolean(user?.is_super_admin);

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

  useEffect(() => {
    if (!isSuperAdmin && user?.company_id) {
      setCompanyId(user.company_id);
    }
  }, [isSuperAdmin, user?.company_id]);

  const companiesQuery = useQuery({
    queryKey: ['admin', 'companies'],
    queryFn: () => listCompanies(),
    enabled: isSuperAdmin,
  });

  const resolvedCompanyId = isSuperAdmin ? companyId : user?.company_id;

  const shouldFetchDepartments =
    canListCompanyDepartments &&
    Boolean(resolvedCompanyId) &&
    (membershipDepartments.length === 0 || isSuperAdmin);

  const companyDepartmentsQuery = useQuery({
    queryKey: ['ticket', 'departments', resolvedCompanyId],
    queryFn: () => listDepartments({ company_id: resolvedCompanyId! }),
    enabled: shouldFetchDepartments,
    staleTime: 60_000,
  });

  const departments = useMemo(() => {
    const activeMembership = membershipDepartments.filter(
      (department) =>
        department.is_active &&
        (!resolvedCompanyId || department.company_id === resolvedCompanyId),
    );

    if (activeMembership.length > 0 && !isSuperAdmin) {
      return activeMembership;
    }

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

    return activeMembership;
  }, [companyDepartmentsQuery.data, isSuperAdmin, membershipDepartments, resolvedCompanyId]);

  useEffect(() => {
    setDepartmentId('');
  }, [resolvedCompanyId]);

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

  const isLoadingDepartments = shouldFetchDepartments && companyDepartmentsQuery.isLoading;

  return {
    departments,
    departmentId,
    setDepartmentId,
    companyId: resolvedCompanyId ?? '',
    setCompanyId,
    companies: companiesQuery.data ?? [],
    isSuperAdmin,
    isLoadingCompanies: companiesQuery.isLoading,
    isLoadingDepartments,
    hasCompany: Boolean(resolvedCompanyId),
    hasDepartments: departments.length > 0,
  };
}
