import { useQuery } from '@tanstack/react-query';
import {
  FormaPagamentoSchema,
  MunicipioSchema,
  PautaSchema,
  ProdutoListResponseSchema,
  ProdutoDetailSchema,
  type FormaPagamento,
  type Municipio,
  type ProdutoListQuery,
  type ProdutoListResponse,
  type ProdutoDetail,
  type Pauta,
} from '@sar/api-interface';
import { z } from 'zod';
import { apiFetch } from '../api-client';

export function useMunicipios(q?: string) {
  return useQuery<Municipio[]>({
    queryKey: ['catalog', 'municipios', q ?? ''],
    queryFn: async () => {
      const qs = q ? `?q=${encodeURIComponent(q)}` : '';
      const res = await apiFetch(`/catalog/municipios${qs}`);
      return z.array(MunicipioSchema).parse(res);
    },
    staleTime: 24 * 60 * 60 * 1000,
    enabled: !q || q.length >= 2,
  });
}

export function usePautas() {
  return useQuery<Pauta[]>({
    queryKey: ['catalog', 'pautas'],
    queryFn: async () => {
      const res = await apiFetch('/catalog/pautas');
      return z.array(PautaSchema).parse(res);
    },
    staleTime: 10 * 60 * 1000,
  });
}

export function useFormasPagamento() {
  return useQuery<FormaPagamento[]>({
    queryKey: ['catalog', 'payment-methods'],
    queryFn: async () => {
      const res = await apiFetch('/catalog/payment-methods');
      return z.array(FormaPagamentoSchema).parse(res);
    },
    staleTime: 60 * 60 * 1000,
  });
}

export function useCatalog(params: Partial<ProdutoListQuery> = {}) {
  const search = new URLSearchParams();
  if (params.q) search.set('q', params.q);
  if (params.codGrupo) search.set('codGrupo', String(params.codGrupo));
  if (params.idPauta) search.set('idPauta', String(params.idPauta));
  if (params.page) search.set('page', String(params.page));
  if (params.limit) search.set('limit', String(params.limit));

  const qs = search.toString();
  return useQuery<ProdutoListResponse>({
    queryKey: ['catalog', params],
    queryFn: async () => {
      const res = await apiFetch(`/catalog${qs ? `?${qs}` : ''}`);
      return ProdutoListResponseSchema.parse(res);
    },
    staleTime: 4 * 60 * 60 * 1000,
  });
}

export function useProdutoDetail(id: number | undefined) {
  return useQuery<ProdutoDetail>({
    queryKey: ['catalog', id],
    enabled: id != null,
    queryFn: async () => {
      const res = await apiFetch(`/catalog/${id}`);
      return ProdutoDetailSchema.parse(res);
    },
  });
}
