import { useState, useEffect, useCallback } from 'react';
import axios from 'axios';

export interface TimesheetSchedule {
  ztes_id: number;
  ztes_user_id: number;
  ztes_cycle: 'daily' | 'weekly';
  ztes_weekly_weekday: number | null;
  ztes_send_time: string;
  ztes_recipients: string[];
  ztes_include_mtd: boolean;
  ztes_enabled: boolean;
  ztes_last_sent_at: string | null;
  ztes_last_skipped_reason: string | null;
  user?: {
    usr_id: number;
    usr_Vorname?: string;
    usr_Name?: string;
    usr_mail?: string | null;
  };
}

export interface TimesheetScheduleInput {
  ztes_id?: number;
  ztes_user_id: number;
  ztes_cycle: 'daily' | 'weekly';
  ztes_weekly_weekday: number | null;
  ztes_send_time: string;
  ztes_recipients: string[];
  ztes_include_mtd: boolean;
  ztes_enabled: boolean;
}

export interface SendNowResult {
  status: 'sent' | 'skipped_no_shifts' | 'mail_error';
  error?: string;
}

export interface UseTimesheetSchedulesReturn {
  schedules: TimesheetSchedule[];
  loading: boolean;
  error: string | null;
  refresh: () => Promise<void>;
  create: (input: TimesheetScheduleInput) => Promise<TimesheetSchedule>;
  update: (id: number, input: TimesheetScheduleInput) => Promise<TimesheetSchedule>;
  remove: (id: number) => Promise<void>;
  sendNow: (id: number) => Promise<SendNowResult>;
}

const BASE_URL = '/zeiterfassung/timesheet-schedules';

export function useTimesheetSchedules(): UseTimesheetSchedulesReturn {
  const [schedules, setSchedules] = useState<TimesheetSchedule[]>([]);
  const [loading, setLoading] = useState<boolean>(true);
  const [error, setError] = useState<string | null>(null);

  const refresh = useCallback(async (): Promise<void> => {
    try {
      setLoading(true);
      setError(null);
      const response = await axios.get<{ data: TimesheetSchedule[] }>(BASE_URL);
      setSchedules(response.data.data || []);
    } catch (e: any) {
      setError(e?.message || 'Fehler beim Laden der Zeitpläne');
    } finally {
      setLoading(false);
    }
  }, []);

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

  const create = useCallback(
    async (input: TimesheetScheduleInput): Promise<TimesheetSchedule> => {
      const response = await axios.post<{ data: TimesheetSchedule }>(BASE_URL, input);
      const created = response.data.data;
      setSchedules((prev) => [...prev, created]);
      return created;
    },
    []
  );

  const update = useCallback(
    async (id: number, input: TimesheetScheduleInput): Promise<TimesheetSchedule> => {
      const response = await axios.put<{ data: TimesheetSchedule }>(`${BASE_URL}/${id}`, input);
      const updated = response.data.data;
      setSchedules((prev) => prev.map((s) => (s.ztes_id === id ? updated : s)));
      return updated;
    },
    []
  );

  const remove = useCallback(async (id: number): Promise<void> => {
    await axios.delete(`${BASE_URL}/${id}`);
    setSchedules((prev) => prev.filter((s) => s.ztes_id !== id));
  }, []);

  const sendNow = useCallback(async (id: number): Promise<SendNowResult> => {
    const response = await axios.post<{ data: SendNowResult }>(`${BASE_URL}/${id}/send-now`);
    await refresh();
    return response.data.data;
  }, [refresh]);

  return {
    schedules,
    loading,
    error,
    refresh,
    create,
    update,
    remove,
    sendNow,
  };
}

export default useTimesheetSchedules;
