'use client';

import { useState, useEffect, useCallback } from 'react';
import {
  getInquiriesPaginated,
  createInquiry,
  updateInquiry,
  deleteInquiry,
  generateDraft,
  confirmDraft,
  requestChanges,
  type InquiryQueryParams,
} from '@/lib/api/inquiry.api';
import { mapInquiriesApiResponse } from '@/lib/api/mappers/inquiry.mappers';
import type {
  InquiryRow,
  PaginationMeta,
  CreateInquiryDto,
  UpdateInquiryDto,
} from '@/lib/api/types/inquiry.types';

// ─── useInquiries ────────────────────────────────────────────────────────────
export function useInquiries(params: InquiryQueryParams = {}) {
  const [data, setData]       = useState<InquiryRow[]>([]);
  const [meta, setMeta]       = useState<PaginationMeta | null>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError]     = useState<string | null>(null);

  const fetch = useCallback((overrides: InquiryQueryParams = {}) => {
    setLoading(true);
    setError(null);
    getInquiriesPaginated({ ...params, ...overrides })
      .then(res => {
        setData(mapInquiriesApiResponse(res.data));
        setMeta(res.meta);
      })
      .catch(err => setError(err.message))
      .finally(() => setLoading(false));
  // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

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

  return { data, meta, loading, error, refresh: fetch };
}

// ─── useInquiryMutations ─────────────────────────────────────────────────────
export function useInquiryMutations(onSuccess?: () => void) {
  const [saving,     setSaving]     = useState(false);
  const [deleting,   setDeleting]   = useState(false);
  const [generating, setGenerating] = useState(false);
  const [mutationError, setMutationError] = useState<string | null>(null);

  const create = async (dto: CreateInquiryDto) => {
    setSaving(true); setMutationError(null);
    try   { const r = await createInquiry(dto); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  const update = async (id: number, dto: UpdateInquiryDto) => {
    setSaving(true); setMutationError(null);
    try   { const r = await updateInquiry(id, dto); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  const remove = async (id: number) => {
    setDeleting(true); setMutationError(null);
    try   { await deleteInquiry(id); onSuccess?.(); return true; }
    catch (err: any) { setMutationError(err.message); return false; }
    finally { setDeleting(false); }
  };

  const generate = async (id: number) => {
    setGenerating(true); setMutationError(null);
    try   { const r = await generateDraft(id); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setGenerating(false); }
  };

  const confirm = async (id: number) => {
    setSaving(true); setMutationError(null);
    try   { const r = await confirmDraft(id); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  const requestChange = async (id: number, notes: string) => {
    setSaving(true); setMutationError(null);
    try   { const r = await requestChanges(id, notes); onSuccess?.(); return r; }
    catch (err: any) { setMutationError(err.message); return null; }
    finally { setSaving(false); }
  };

  return {
    create, update, remove, generate, confirm, requestChange,
    saving, deleting, generating, mutationError,
  };
}
