import { useState, useCallback } from 'react';
import axios from 'axios';
import { t } from '@lingui/macro';
import { useLingui } from '@lingui/react';
import { WeekInfo, Department } from '../types/shift';
import { handleApiError } from '../utils/errorHandler';

interface UseShiftExportOptions {
  weekInfo: WeekInfo;
  selectedDepartment: number | '';
  departments: Department[];
}

interface UseShiftExportReturn {
  exportDialogOpen: boolean;
  setExportDialogOpen: (open: boolean) => void;
  exportWeekCount: number;
  setExportWeekCount: (count: number) => void;
  exportError: string;
  setExportError: (error: string) => void;
  handleOpenExportDialog: () => void;
  handleExportPlan: () => Promise<void>;
}

export function useShiftExport(options: UseShiftExportOptions): UseShiftExportReturn {
  const { weekInfo, selectedDepartment, departments } = options;
  const { i18n } = useLingui();

  const [exportDialogOpen, setExportDialogOpen] = useState(false);
  const [exportWeekCount, setExportWeekCount] = useState(1);
  const [exportError, setExportError] = useState('');

  const handleOpenExportDialog = useCallback(() => {
    setExportError('');
    setExportDialogOpen(true);
  }, []);

  const handleExportPlan = useCallback(async () => {
    if (!selectedDepartment) {
      setExportError(i18n._(t`Bitte wählen Sie einen Bereich aus`));
      return;
    }

    try {
      const dept = departments.find((d) => d.ber_id === selectedDepartment);
      const deptName = dept?.ber_name || 'Bereich';

      const response = await axios.post(
        '/zeiterfassung/shifts/export-pdf',
        {
          year: weekInfo.year,
          week: weekInfo.week,
          ber_id: selectedDepartment,
          week_count: exportWeekCount,
        },
        { responseType: 'blob' }
      );

      const url = window.URL.createObjectURL(new Blob([response.data]));
      const link = document.createElement('a');
      link.href = url;
      link.setAttribute(
        'download',
        `schichtplan_${deptName}_KW${weekInfo.week}-${weekInfo.week + exportWeekCount - 1}_${weekInfo.year}.pdf`
      );
      document.body.appendChild(link);
      link.click();
      link.remove();
      window.URL.revokeObjectURL(url);

      setExportDialogOpen(false);
      setExportWeekCount(1);
    } catch (error: any) {
      setExportError(handleApiError('exporting plan', error));
    }
  }, [selectedDepartment, departments, weekInfo, exportWeekCount, i18n]);

  return {
    exportDialogOpen,
    setExportDialogOpen,
    exportWeekCount,
    setExportWeekCount,
    exportError,
    setExportError,
    handleOpenExportDialog,
    handleExportPlan,
  };
}

export default useShiftExport;
