import { api } from './api';
import type {
  AusruestungArtikel,
  AusruestungArtikelFormData,
  AusruestungAnfrageDetailResponse,
  AusruestungAnfrageFormItem,
  AusruestungOverview,
  AusruestungKategorie,
  AusruestungEigenschaft,
  AusruestungAnfrage,
  AusruestungWidgetOverview,
  CreateOrdersRequest,
  CreateOrdersResponse,
  UnassignedPosition,
} from '../types/ausruestungsanfrage.types';

export const ausruestungsanfrageApi = {
  // ── Categories (DB-backed, hierarchical) ──
  getKategorien: async (): Promise<AusruestungKategorie[]> => {
    const r = await api.get('/api/ausruestungsanfragen/kategorien');
    return r.data.data;
  },
  createKategorie: async (name: string, parentId?: number | null): Promise<AusruestungKategorie> => {
    const r = await api.post('/api/ausruestungsanfragen/kategorien', { name, parent_id: parentId ?? null });
    return r.data.data;
  },
  updateKategorie: async (id: number, data: { name?: string; parent_id?: number | null }): Promise<AusruestungKategorie> => {
    const r = await api.patch(`/api/ausruestungsanfragen/kategorien/${id}`, data);
    return r.data.data;
  },
  deleteKategorie: async (id: number): Promise<void> => {
    await api.delete(`/api/ausruestungsanfragen/kategorien/${id}`);
  },

  // ── Catalog Items ──
  getItems: async (filters?: { kategorie?: string; kategorie_id?: number; aktiv?: boolean; search?: string }): Promise<AusruestungArtikel[]> => {
    const params = new URLSearchParams();
    if (filters?.kategorie) params.set('kategorie', filters.kategorie);
    if (filters?.kategorie_id) params.set('kategorie_id', String(filters.kategorie_id));
    if (filters?.aktiv !== undefined) params.set('aktiv', String(filters.aktiv));
    if (filters?.search) params.append('search', filters.search);
    const r = await api.get(`/api/ausruestungsanfragen/items?${params.toString()}`);
    return r.data.data;
  },
  getItem: async (id: number): Promise<AusruestungArtikel> => {
    const r = await api.get(`/api/ausruestungsanfragen/items/${id}`);
    return r.data.data;
  },
  createItem: async (data: AusruestungArtikelFormData): Promise<AusruestungArtikel> => {
    const r = await api.post('/api/ausruestungsanfragen/items', data);
    return r.data.data;
  },
  updateItem: async (id: number, data: Partial<AusruestungArtikelFormData>): Promise<AusruestungArtikel> => {
    const r = await api.patch(`/api/ausruestungsanfragen/items/${id}`, data);
    return r.data.data;
  },
  deleteItem: async (id: number): Promise<void> => {
    await api.delete(`/api/ausruestungsanfragen/items/${id}`);
  },
  getCategories: async (): Promise<string[]> => {
    const r = await api.get('/api/ausruestungsanfragen/categories');
    return r.data.data;
  },

  // ── Item Eigenschaften (characteristics) ──
  getArtikelEigenschaften: async (artikelId: number): Promise<AusruestungEigenschaft[]> => {
    const r = await api.get(`/api/ausruestungsanfragen/items/${artikelId}/eigenschaften`);
    return r.data.data;
  },
  upsertArtikelEigenschaft: async (
    artikelId: number,
    data: { eigenschaft_id?: number; name: string; typ: string; optionen?: string[]; pflicht?: boolean; sort_order?: number },
  ): Promise<AusruestungEigenschaft> => {
    const r = await api.post(`/api/ausruestungsanfragen/items/${artikelId}/eigenschaften`, data);
    return r.data.data;
  },
  deleteArtikelEigenschaft: async (eigenschaftId: number): Promise<void> => {
    await api.delete(`/api/ausruestungsanfragen/eigenschaften/${eigenschaftId}`);
  },

  // ── Requests ──
  getRequests: async (filters?: { status?: string }): Promise<AusruestungAnfrage[]> => {
    const params = new URLSearchParams();
    if (filters?.status) params.set('status', filters.status);
    const r = await api.get(`/api/ausruestungsanfragen/requests?${params.toString()}`);
    return r.data.data;
  },
  getMyRequests: async (): Promise<AusruestungAnfrage[]> => {
    const r = await api.get('/api/ausruestungsanfragen/requests/my');
    return r.data.data;
  },
  getRequest: async (id: number): Promise<AusruestungAnfrageDetailResponse> => {
    const r = await api.get(`/api/ausruestungsanfragen/requests/${id}`);
    return r.data.data;
  },
  createRequest: async (
    items: AusruestungAnfrageFormItem[],
    notizen?: string,
    bezeichnung?: string,
    fuer_benutzer_id?: string,
    fuer_benutzer_name?: string,
    assignedItems?: { persoenlich_id: string; neuer_zustand: string }[],
  ): Promise<AusruestungAnfrageDetailResponse> => {
    // Merge assigned personal items into the items array with ist_ersatz: true
    const allItems = [
      ...items,
      ...(assignedItems ?? []).map(a => ({
        bezeichnung: '', // backend resolves from persoenlich_id
        menge: 1,
        persoenlich_id: a.persoenlich_id,
        neuer_zustand: a.neuer_zustand,
        ist_ersatz: true,
      })),
    ];
    const r = await api.post('/api/ausruestungsanfragen/requests', { items: allItems, notizen, bezeichnung, fuer_benutzer_id, fuer_benutzer_name });
    return r.data.data;
  },
  updateRequest: async (
    id: number,
    data: { bezeichnung?: string; notizen?: string; items?: AusruestungAnfrageFormItem[] },
  ): Promise<AusruestungAnfrageDetailResponse> => {
    const r = await api.patch(`/api/ausruestungsanfragen/requests/${id}`, data);
    return r.data.data;
  },
  updateRequestStatus: async (id: number, status: string, admin_notizen?: string): Promise<AusruestungAnfrage> => {
    const r = await api.patch(`/api/ausruestungsanfragen/requests/${id}/status`, { status, admin_notizen });
    return r.data.data;
  },
  deleteRequest: async (id: number): Promise<void> => {
    await api.delete(`/api/ausruestungsanfragen/requests/${id}`);
  },

  // ── Position delivery tracking ──
  updatePositionGeliefert: async (positionId: number, geliefert: boolean): Promise<void> => {
    await api.patch(`/api/ausruestungsanfragen/positionen/${positionId}/geliefert`, { geliefert });
  },

  // ── Item assignment ──
  assignItems: async (
    anfrageId: number,
    assignments: Array<{
      positionId: number;
      typ: 'ausruestung' | 'persoenlich' | 'keine';
      fahrzeugId?: string;
      standort?: string;
      userId?: string;
      benutzerName?: string;
      groesse?: string;
      kategorie?: string;
      eigenschaften?: Array<{ eigenschaft_id?: number; name: string; wert: string }>;
    }>,
  ): Promise<void> => {
    await api.post(`/api/ausruestungsanfragen/requests/${anfrageId}/assign`, { assignments });
  },

  updatePositionZurueckgegeben: async (positionId: number, altes_geraet_zurueckgegeben: boolean): Promise<void> => {
    await api.patch(`/api/ausruestungsanfragen/positionen/${positionId}/zurueckgegeben`, { altes_geraet_zurueckgegeben });
  },

  // ── Linking ──
  linkToOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
    await api.post(`/api/ausruestungsanfragen/requests/${anfrageId}/link`, { bestellung_id: bestellungId });
  },
  unlinkFromOrder: async (anfrageId: number, bestellungId: number): Promise<void> => {
    await api.delete(`/api/ausruestungsanfragen/requests/${anfrageId}/link/${bestellungId}`);
  },

  // ── Create orders from request ──
  createOrders: async (anfrageId: number, payload: CreateOrdersRequest): Promise<CreateOrdersResponse> => {
    const r = await api.post(`/api/ausruestungsanfragen/requests/${anfrageId}/create-orders`, payload);
    return r.data.data;
  },

  // ── Overview ──
  getOverview: async (): Promise<AusruestungOverview> => {
    const r = await api.get('/api/ausruestungsanfragen/overview');
    return r.data.data;
  },

  // ── Widget overview ──
  getWidgetOverview: async (): Promise<AusruestungWidgetOverview> => {
    const r = await api.get('/api/ausruestungsanfragen/widget-overview');
    return r.data.data;
  },

  // ── Users ──
  getOrderUsers: async (): Promise<Array<{ id: string; name: string }>> => {
    const r = await api.get('/api/ausruestungsanfragen/users');
    return r.data.data;
  },

  // ── Position linking ──
  linkPositionToArtikel: async (positionId: number, artikelId: number): Promise<void> => {
    await api.patch(`/api/ausruestungsanfrage/positionen/${positionId}/artikel`, { artikel_id: artikelId });
  },

  // ── Unassigned positions ──
  getUnassignedPositions: async (): Promise<UnassignedPosition[]> => {
    const r = await api.get<{ success: boolean; data: UnassignedPosition[] }>('/api/ausruestungsanfrage/nicht-zugewiesen');
    return r.data.data;
  },
};
