import { api } from './api';
import type {
  ChecklistVorlage,
  ChecklistVorlageItem,
  FahrzeugChecklistItem,
  ChecklistAusfuehrung,
  ChecklistFaelligkeit,
  ChecklistOverviewResponse,
  ChecklistVorlageFilter,
  ChecklistAusfuehrungFilter,
  CreateVorlagePayload,
  UpdateVorlagePayload,
  CreateVorlageItemPayload,
  UpdateVorlageItemPayload,
  CreateFahrzeugItemPayload,
  UpdateFahrzeugItemPayload,
  SubmitAusfuehrungPayload,
} from '../types/checklist.types';

export const checklistenApi = {
  // ── Overview ──
  getOverview: async (): Promise<ChecklistOverviewResponse> => {
    const r = await api.get('/api/checklisten/overview');
    return r.data.data ?? r.data;
  },

  // ── Vorlagen (Templates) ──
  getVorlagen: async (filter?: ChecklistVorlageFilter): Promise<ChecklistVorlage[]> => {
    const params = new URLSearchParams();
    if (filter?.aktiv != null) params.set('aktiv', String(filter.aktiv));
    const qs = params.toString();
    const r = await api.get(`/api/checklisten/vorlagen${qs ? `?${qs}` : ''}`);
    return r.data.data;
  },

  getVorlage: async (id: number): Promise<ChecklistVorlage> => {
    const r = await api.get(`/api/checklisten/vorlagen/${id}`);
    return r.data.data;
  },

  createVorlage: async (data: CreateVorlagePayload): Promise<ChecklistVorlage> => {
    const r = await api.post('/api/checklisten/vorlagen', data);
    return r.data.data;
  },

  updateVorlage: async (id: number, data: UpdateVorlagePayload): Promise<ChecklistVorlage> => {
    const r = await api.put(`/api/checklisten/vorlagen/${id}`, data);
    return r.data.data;
  },

  deleteVorlage: async (id: number): Promise<void> => {
    await api.delete(`/api/checklisten/vorlagen/${id}`);
  },

  // ── Vorlage Items ──
  getVorlageItems: async (vorlageId: number): Promise<ChecklistVorlageItem[]> => {
    const r = await api.get(`/api/checklisten/vorlagen/${vorlageId}/items`);
    return r.data.data;
  },

  addVorlageItem: async (vorlageId: number, data: CreateVorlageItemPayload): Promise<ChecklistVorlageItem> => {
    const r = await api.post(`/api/checklisten/vorlagen/${vorlageId}/items`, data);
    return r.data.data;
  },

  updateVorlageItem: async (id: number, data: UpdateVorlageItemPayload): Promise<ChecklistVorlageItem> => {
    const r = await api.put(`/api/checklisten/items/${id}`, data);
    return r.data.data;
  },

  deleteVorlageItem: async (id: number): Promise<void> => {
    await api.delete(`/api/checklisten/items/${id}`);
  },

  // ── Vehicle-specific Items ──
  getVehicleItems: async (fahrzeugId: string): Promise<FahrzeugChecklistItem[]> => {
    const r = await api.get(`/api/checklisten/fahrzeug/${fahrzeugId}/items`);
    return r.data.data;
  },

  addVehicleItem: async (fahrzeugId: string, data: CreateFahrzeugItemPayload): Promise<FahrzeugChecklistItem> => {
    const r = await api.post(`/api/checklisten/fahrzeug/${fahrzeugId}/items`, data);
    return r.data.data;
  },

  updateVehicleItem: async (id: number, data: UpdateFahrzeugItemPayload): Promise<FahrzeugChecklistItem> => {
    const r = await api.put(`/api/checklisten/fahrzeug-items/${id}`, data);
    return r.data.data;
  },

  deleteVehicleItem: async (id: number): Promise<void> => {
    await api.delete(`/api/checklisten/fahrzeug-items/${id}`);
  },

  // ── Equipment-specific Items ──
  getTemplatesForEquipment: async (ausruestungId: string): Promise<ChecklistVorlage[]> => {
    const r = await api.get(`/api/checklisten/equipment/${ausruestungId}/vorlagen`);
    return r.data.data;
  },

  getEquipmentItems: async (ausruestungId: string): Promise<FahrzeugChecklistItem[]> => {
    const r = await api.get(`/api/checklisten/equipment/${ausruestungId}/items`);
    return r.data.data;
  },

  addEquipmentItem: async (ausruestungId: string, data: CreateFahrzeugItemPayload): Promise<FahrzeugChecklistItem> => {
    const r = await api.post(`/api/checklisten/equipment/${ausruestungId}/items`, data);
    return r.data.data;
  },

  updateEquipmentItem: async (ausruestungId: string, itemId: number, data: UpdateFahrzeugItemPayload): Promise<FahrzeugChecklistItem> => {
    const r = await api.patch(`/api/checklisten/equipment/${ausruestungId}/items/${itemId}`, data);
    return r.data.data;
  },

  deleteEquipmentItem: async (ausruestungId: string, itemId: number): Promise<void> => {
    await api.delete(`/api/checklisten/equipment/${ausruestungId}/items/${itemId}`);
  },

  // ── Checklists for a Vehicle ──
  getChecklistenForVehicle: async (fahrzeugId: string): Promise<ChecklistVorlage[]> => {
    const r = await api.get(`/api/checklisten/fahrzeug/${fahrzeugId}/checklisten`);
    return r.data.data;
  },

  // ── Executions ──
  startExecution: async (vorlageId: number, opts: { fahrzeugId?: string; ausruestungId?: string }): Promise<ChecklistAusfuehrung> => {
    const r = await api.post('/api/checklisten/ausfuehrungen', {
      vorlageId: vorlageId,
      fahrzeugId: opts.fahrzeugId,
      ausruestungId: opts.ausruestungId,
    });
    return r.data.data;
  },

  submitExecution: async (id: string, data: SubmitAusfuehrungPayload): Promise<ChecklistAusfuehrung> => {
    const r = await api.put(`/api/checklisten/ausfuehrungen/${id}`, data);
    return r.data.data;
  },

  approveExecution: async (id: string): Promise<ChecklistAusfuehrung> => {
    const r = await api.post(`/api/checklisten/ausfuehrungen/${id}/freigabe`);
    return r.data.data;
  },

  getExecution: async (id: string): Promise<ChecklistAusfuehrung> => {
    const r = await api.get(`/api/checklisten/ausfuehrungen/${id}`);
    return r.data.data;
  },

  getExecutions: async (filter?: ChecklistAusfuehrungFilter): Promise<ChecklistAusfuehrung[]> => {
    const params = new URLSearchParams();
    if (filter?.fahrzeug_id) params.set('fahrzeug_id', filter.fahrzeug_id);
    if (filter?.vorlage_id != null) params.set('vorlage_id', String(filter.vorlage_id));
    if (filter?.status?.length) params.set('status', filter.status.join(','));
    const qs = params.toString();
    const r = await api.get(`/api/checklisten/ausfuehrungen${qs ? `?${qs}` : ''}`);
    return r.data.data;
  },

  // ── Overdue / Due ──
  getOverdue: async (): Promise<ChecklistFaelligkeit[]> => {
    const r = await api.get('/api/checklisten/faellig');
    return r.data.data;
  },
};
