import { useCallback, useEffect, useState } from 'react';
import axios from 'axios';
import { t } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { useToast } from '../components/shared/ToastProvider';
import { extractErrorMessage } from '../utils/errorHandler';
import type { BerClassSettings } from '../types/class';

export interface UseBerClassSettingsReturn {
  settings: BerClassSettings | null;
  loading: boolean;
  saving: boolean;
  handleChange: (field: keyof BerClassSettings, value: any) => void;
  handleSave: () => Promise<void>;
}

export function useBerClassSettings(berId: number | ''): UseBerClassSettingsReturn {
  const { i18n } = useLingui();
  const toast = useToast();
  const [settings, setSettings] = useState<BerClassSettings | null>(null);
  const [loading, setLoading] = useState<boolean>(false);
  const [saving, setSaving] = useState<boolean>(false);

  const load = useCallback(async (): Promise<void> => {
    if (berId === '' || berId === null || berId === undefined) {
      setSettings(null);
      return;
    }
    try {
      setLoading(true);
      const response = await axios.get(`/zeiterfassung/ber-class-settings/${berId}`);
      setSettings(response.data as BerClassSettings);
    } catch (err) {
      const message: string = extractErrorMessage(err);
      toast.error({
        title: i18n._(t`Fehler beim Laden der Klasseneinstellungen`),
        description: message,
      });
      setSettings(null);
    } finally {
      setLoading(false);
    }
  }, [berId, i18n, toast]);

  useEffect(() => {
    load();
  }, [load]);

  const handleChange = useCallback(
    (field: keyof BerClassSettings, value: any): void => {
      setSettings((prev) => (prev ? { ...prev, [field]: value } : prev));
    },
    []
  );

  const handleSave = useCallback(async (): Promise<void> => {
    if (!settings || berId === '' || berId === null || berId === undefined) {
      return;
    }
    try {
      setSaving(true);
      const response = await axios.put(`/zeiterfassung/ber-class-settings/${berId}`, {
        zbcs_becken_transfer_minutes: settings.zbcs_becken_transfer_minutes,
        zbcs_class_watchdog_user_id: settings.zbcs_class_watchdog_user_id,
      });
      setSettings(response.data as BerClassSettings);
      toast.success({ title: i18n._(t`Einstellungen gespeichert`) });
    } catch (err) {
      const message: string = extractErrorMessage(err);
      toast.error({
        title: i18n._(t`Fehler beim Speichern`),
        description: message,
      });
    } finally {
      setSaving(false);
    }
  }, [berId, i18n, settings, toast]);

  return { settings, loading, saving, handleChange, handleSave };
}

export default useBerClassSettings;
