import { api } from './api';
import type {
  Haushaltsjahr, HaushaltsjahrFormData,
  Bankkonto, BankkontoFormData,
  Konto, KontoFormData, KontoBudgetInfo,
  KontoTyp, KontoTreeNode, KontoDetailResponse,
  Transaktion, TransaktionFormData, TransaktionFilters,
  Beleg,
  BuchhaltungStats,
  WiederkehrendBuchung, WiederkehrendFormData,
  Freigabe,
  Kategorie,
  ErstattungFormData, ErstattungLinks,
  TransferFormData,
  BuchhaltungAudit,
  BuchhaltungEinstellungen,
  BankkontoStatement,
  Planung, PlanungDetail, Planposition,
} from '../types/buchhaltung.types';

export const buchhaltungApi = {

  // ── Haushaltsjahre ──────────────────────────────────────────────────────────
  getHaushaltsjahre: async (): Promise<Haushaltsjahr[]> => {
    const r = await api.get('/api/buchhaltung/haushaltsjahre');
    return r.data.data;
  },
  createHaushaltsjahr: async (data: HaushaltsjahrFormData): Promise<Haushaltsjahr> => {
    const r = await api.post('/api/buchhaltung/haushaltsjahre', data);
    return r.data.data;
  },
  updateHaushaltsjahr: async (id: number, data: Partial<HaushaltsjahrFormData>): Promise<Haushaltsjahr> => {
    const r = await api.patch(`/api/buchhaltung/haushaltsjahre/${id}`, data);
    return r.data.data;
  },
  closeHaushaltsjahr: async (id: number): Promise<Haushaltsjahr> => {
    const r = await api.post(`/api/buchhaltung/haushaltsjahre/${id}/close`);
    return r.data.data;
  },

  // ── Konto-Typen ─────────────────────────────────────────────────────────────
  getKontoTypen: async (): Promise<KontoTyp[]> => {
    const r = await api.get('/api/buchhaltung/konto-typen');
    return r.data.data;
  },
  createKontoTyp: async (data: { bezeichnung: string; art: string; sort_order?: number }): Promise<KontoTyp> => {
    const r = await api.post('/api/buchhaltung/konto-typen', data);
    return r.data.data;
  },
  updateKontoTyp: async (id: number, data: Partial<{ bezeichnung: string; art: string; sort_order: number }>): Promise<KontoTyp> => {
    const r = await api.patch(`/api/buchhaltung/konto-typen/${id}`, data);
    return r.data.data;
  },
  deleteKontoTyp: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/konto-typen/${id}`);
  },

  // ── Bankkonten ───────────────────────────────────────────────────────────────
  getBankkonten: async (): Promise<Bankkonto[]> => {
    const r = await api.get('/api/buchhaltung/bankkonten');
    return r.data.data;
  },
  createBankkonto: async (data: BankkontoFormData): Promise<Bankkonto> => {
    const r = await api.post('/api/buchhaltung/bankkonten', data);
    return r.data.data;
  },
  updateBankkonto: async (id: number, data: Partial<BankkontoFormData>): Promise<Bankkonto> => {
    const r = await api.patch(`/api/buchhaltung/bankkonten/${id}`, data);
    return r.data.data;
  },
  deleteBankkonto: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/bankkonten/${id}`);
  },
  getBankkontoStatement: async (id: number, params?: { von?: string; bis?: string }): Promise<BankkontoStatement> => {
    const qs = new URLSearchParams();
    if (params?.von) qs.set('von', params.von);
    if (params?.bis) qs.set('bis', params.bis);
    const r = await api.get(`/api/buchhaltung/bankkonten/${id}/transaktionen?${qs.toString()}`);
    const d = r.data;
    return {
      bankkonto: d.konto,
      einnahmen: d.summary.gesamteinnahmen,
      ausgaben: d.summary.gesamtausgaben,
      saldo: d.summary.saldo,
      rows: d.rows,
    };
  },

  // ── Konten ───────────────────────────────────────────────────────────────────
  getKonten: async (haushaltsjahrId: number): Promise<Konto[]> => {
    const r = await api.get(`/api/buchhaltung/konten?haushaltsjahr_id=${haushaltsjahrId}`);
    return r.data.data;
  },
  createKonto: async (data: KontoFormData): Promise<Konto> => {
    const r = await api.post('/api/buchhaltung/konten', data);
    return r.data.data;
  },
  updateKonto: async (id: number, data: Partial<KontoFormData>): Promise<Konto> => {
    const r = await api.patch(`/api/buchhaltung/konten/${id}`, data);
    return r.data.data;
  },
  deleteKonto: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/konten/${id}`);
  },
  getKontoBudget: async (id: number): Promise<KontoBudgetInfo> => {
    const r = await api.get(`/api/buchhaltung/konten/${id}/budget`);
    return r.data.data;
  },
  getKontenTree: async (haushaltsjahrId: number): Promise<KontoTreeNode[]> => {
    const r = await api.get(`/api/buchhaltung/konten/tree?haushaltsjahr_id=${haushaltsjahrId}`);
    return r.data;
  },
  getKontoDetail: async (id: number): Promise<KontoDetailResponse> => {
    const r = await api.get(`/api/buchhaltung/konten/${id}/detail`);
    return r.data;
  },

  // ── Stats ────────────────────────────────────────────────────────────────────
  getStats: async (haushaltsjahrId: number): Promise<BuchhaltungStats> => {
    const r = await api.get(`/api/buchhaltung/stats?haushaltsjahr_id=${haushaltsjahrId}`);
    return r.data.data;
  },
  getPendingCount: async (haushaltsjahrId?: number): Promise<number> => {
    const params = haushaltsjahrId ? `?haushaltsjahr_id=${haushaltsjahrId}` : '';
    const r = await api.get(`/api/buchhaltung/stats/pending${params}`);
    return r.data.count;
  },

  // ── Transaktionen ─────────────────────────────────────────────────────────────
  getTransaktionen: async (filters?: TransaktionFilters): Promise<Transaktion[]> => {
    const params = new URLSearchParams();
    if (filters?.haushaltsjahr_id) params.set('haushaltsjahr_id', String(filters.haushaltsjahr_id));
    if (filters?.konto_id)         params.set('konto_id',         String(filters.konto_id));
    if (filters?.status)           params.set('status',           filters.status);
    if (filters?.typ)              params.set('typ',              filters.typ);
    if (filters?.datum_von)        params.set('datum_von',        filters.datum_von);
    if (filters?.datum_bis)        params.set('datum_bis',        filters.datum_bis);
    if (filters?.search)           params.set('search',           filters.search);
    const r = await api.get(`/api/buchhaltung?${params.toString()}`);
    return r.data.data;
  },
  getTransaktion: async (id: number): Promise<Transaktion> => {
    const r = await api.get(`/api/buchhaltung/${id}`);
    return r.data.data;
  },
  createTransaktion: async (data: TransaktionFormData): Promise<Transaktion> => {
    const r = await api.post('/api/buchhaltung', data);
    return r.data.data;
  },
  updateTransaktion: async (id: number, data: Partial<TransaktionFormData>): Promise<Transaktion> => {
    const r = await api.patch(`/api/buchhaltung/${id}`, data);
    return r.data.data;
  },
  deleteTransaktion: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/${id}`);
  },
  buchenTransaktion: async (id: number): Promise<Transaktion> => {
    const r = await api.post(`/api/buchhaltung/${id}/buchen`);
    return r.data.data;
  },
  stornoTransaktion: async (id: number): Promise<Transaktion> => {
    const r = await api.post(`/api/buchhaltung/${id}/storno`);
    return r.data.data;
  },
  uploadBeleg: async (transaktionId: number, file: File): Promise<Beleg> => {
    const formData = new FormData();
    formData.append('datei', file);
    const r = await api.post(`/api/buchhaltung/${transaktionId}/belege`, formData, {
      headers: { 'Content-Type': 'multipart/form-data' },
    });
    return r.data.data;
  },
  deleteBeleg: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/belege/${id}`);
  },

  // ── Wiederkehrend ─────────────────────────────────────────────────────────────
  getWiederkehrend: async (): Promise<WiederkehrendBuchung[]> => {
    const r = await api.get('/api/buchhaltung/wiederkehrend');
    return r.data.data;
  },
  createWiederkehrend: async (data: WiederkehrendFormData): Promise<WiederkehrendBuchung> => {
    const r = await api.post('/api/buchhaltung/wiederkehrend', data);
    return r.data.data;
  },
  updateWiederkehrend: async (id: number, data: Partial<WiederkehrendFormData>): Promise<WiederkehrendBuchung> => {
    const r = await api.patch(`/api/buchhaltung/wiederkehrend/${id}`, data);
    return r.data.data;
  },
  deleteWiederkehrend: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/wiederkehrend/${id}`);
  },

  // ── CSV Export ────────────────────────────────────────────────────────────────
  exportCsv: async (haushaltsjahrId: number): Promise<Blob> => {
    const r = await api.get(`/api/buchhaltung/export/csv?haushaltsjahr_id=${haushaltsjahrId}`, { responseType: 'blob' });
    return r.data;
  },

  // ── Kategorien ──────────────────────────────────────────────────────────────
  getKategorien: async (haushaltsjahrId: number): Promise<Kategorie[]> => {
    const r = await api.get(`/api/buchhaltung/kategorien?haushaltsjahr_id=${haushaltsjahrId}`);
    return r.data.data;
  },
  createKategorie: async (data: { haushaltsjahr_id: number; bezeichnung: string; sortierung?: number }): Promise<Kategorie> => {
    const r = await api.post('/api/buchhaltung/kategorien', data);
    return r.data.data;
  },
  updateKategorie: async (id: number, data: Partial<{ bezeichnung: string; sortierung: number }>): Promise<Kategorie> => {
    const r = await api.patch(`/api/buchhaltung/kategorien/${id}`, data);
    return r.data.data;
  },
  deleteKategorie: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/kategorien/${id}`);
  },

  // ── Freigaben ─────────────────────────────────────────────────────────────────
  requestFreigabe: async (transaktionId: number): Promise<Freigabe> => {
    const r = await api.post(`/api/buchhaltung/${transaktionId}/freigabe`);
    return r.data.data;
  },
  approveFreigabe: async (id: number, kommentar?: string): Promise<Freigabe> => {
    const r = await api.patch(`/api/buchhaltung/freigaben/${id}/genehmigen`, { kommentar });
    return r.data.data;
  },
  rejectFreigabe: async (id: number, kommentar?: string): Promise<Freigabe> => {
    const r = await api.patch(`/api/buchhaltung/freigaben/${id}/ablehnen`, { kommentar });
    return r.data.data;
  },

  // ── Erstattungen ─────────────────────────────────────────────────────────────
  createErstattung: async (data: ErstattungFormData): Promise<Transaktion> => {
    const r = await api.post('/api/buchhaltung/erstattungen', data);
    return r.data.data;
  },
  getErstattungLinks: async (transaktionId: number): Promise<ErstattungLinks> => {
    const r = await api.get(`/api/buchhaltung/transaktionen/${transaktionId}/erstattung-links`);
    return r.data.data;
  },

  // ── Transfers ──────────────────────────────────────────────────────────────
  createTransfer: async (data: TransferFormData): Promise<{ debit: Transaktion; credit: Transaktion }> => {
    const r = await api.post('/api/buchhaltung/transfers', data);
    return r.data.data;
  },

  // ── Audit ─────────────────────────────────────────────────────────────────
  getAudit: async (transaktionId: number): Promise<BuchhaltungAudit[]> => {
    const r = await api.get(`/api/buchhaltung/audit/${transaktionId}`);
    return r.data.data;
  },

  // ── Einstellungen ─────────────────────────────────────────────────────────
  getEinstellungen: async (): Promise<BuchhaltungEinstellungen> => {
    const r = await api.get('/api/buchhaltung/einstellungen');
    return r.data.data;
  },
  setEinstellungen: async (data: Record<string, unknown>): Promise<void> => {
    await api.put('/api/buchhaltung/einstellungen', data);
  },

  // ── Planung ───────────────────────────────────────────────────────────────
  listPlanungen: async (): Promise<Planung[]> => {
    const r = await api.get('/api/buchhaltung/planung');
    return r.data.data;
  },
  getPlanung: async (id: number): Promise<PlanungDetail> => {
    const r = await api.get(`/api/buchhaltung/planung/${id}`);
    return r.data.data;
  },
  createPlanung: async (data: { haushaltsjahr_id?: number; bezeichnung: string }): Promise<Planung> => {
    const r = await api.post('/api/buchhaltung/planung', data);
    return r.data.data;
  },
  updatePlanung: async (id: number, data: { bezeichnung?: string; status?: string }): Promise<Planung> => {
    const r = await api.put(`/api/buchhaltung/planung/${id}`, data);
    return r.data.data;
  },
  deletePlanung: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/planung/${id}`);
  },
  createPlanposition: async (planungId: number, data: { konto_id?: number | null; bezeichnung: string; budget_gwg?: number; budget_anlagen?: number; budget_instandhaltung?: number; notizen?: string; sort_order?: number }): Promise<Planposition> => {
    const r = await api.post(`/api/buchhaltung/planung/${planungId}/positionen`, data);
    return r.data.data;
  },
  updatePlanposition: async (id: number, data: Partial<{ konto_id: number | null; bezeichnung: string; budget_gwg: number; budget_anlagen: number; budget_instandhaltung: number; notizen: string; sort_order: number }>): Promise<Planposition> => {
    const r = await api.put(`/api/buchhaltung/planung/positionen/${id}`, data);
    return r.data.data;
  },
  deletePlanposition: async (id: number): Promise<void> => {
    await api.delete(`/api/buchhaltung/planung/positionen/${id}`);
  },
  createHaushaltsjahrFromPlan: async (planungId: number): Promise<Haushaltsjahr> => {
    const r = await api.post(`/api/buchhaltung/planung/${planungId}/create-haushaltsjahr`);
    return r.data.data;
  },
};
