// LOS DATOS DEL COMPRADOR PARA LA FACTURA.
//
// OJO CON LA FRONTERA, que es lo que decide todo: aca NO se calcula, ni se
// muestra, ni se reporta un impuesto. Gustito solo pregunta a nombre de quien
// sale la factura y guarda ese dato. El impuesto, la numeracion y el sellado
// viven DENTRO de la Estacion Fiscal, en el equipo del negocio y con su RIF.
//
// Y NO ES UN INTERRUPTOR: toda venta se sella igual, pida o no pida el cliente.
// Lo unico que cambia es si el documento sale con sus datos o como Consumidor
// Final, que es exactamente lo que hace una maquina fiscal.
//
// El bloque solo aparece si la imprenta habilito a ese negocio. Mientras no lo
// habiliten, para el negocio la facturacion sencillamente no existe.
import { useQuery } from '@tanstack/react-query';
import { supabase } from '../lib/supabase';

export interface DatosFiscales {
  rif: string;
  razon: string;
  direccion: string;
  correo: string;
}

export const SIN_DATOS_FISCALES: DatosFiscales = { rif: '', razon: '', direccion: '', correo: '' };

export const hayDatosFiscales = (d: DatosFiscales): boolean => d.rif.trim().length > 0;

/** ¿Este negocio esta habilitado para facturar? Lo decide la imprenta, no el. */
export function useFacturaActiva(restauranteId?: string): boolean {
  const { data } = useQuery({
    queryKey: ['estado-fiscal', restauranteId],
    enabled: !!restauranteId,
    staleTime: 5 * 60_000,
    queryFn: async () => {
      const { data, error } = await supabase.rpc('fn_estado_fiscal', { p_restaurante_id: restauranteId as string });
      if (error) return false;
      return !!(data as unknown as { activa?: boolean })?.activa;
    },
  });
  return data === true;
}

/**
 * Guarda los datos del comprador. Devuelve el problema en cristiano, o null si
 * salio bien. La validacion del RIF la hace la BASE (fn_rif_valido): aca no se
 * copia esa logica a proposito, para no meterle nada fiscal a Gustito.
 */
export async function guardarDatosFiscales(
  tipo: 'pedido' | 'cuenta',
  id: string,
  d: DatosFiscales,
): Promise<string | null> {
  if (!hayDatosFiscales(d)) return null;
  const { error } = await supabase.rpc('guardar_datos_fiscales', {
    p_tipo: tipo,
    p_id: id,
    p_rif: d.rif.trim(),
    p_razon_social: d.razon.trim() || undefined,
    p_direccion: d.direccion.trim() || undefined,
    p_correo: d.correo.trim() || undefined,
  });
  return error ? error.message : null;
}

const campo =
  'w-full rounded-xl border border-white/15 bg-superficie-2 px-3 py-2.5 text-sm font-medium outline-none placeholder:text-white/45 focus:border-white/35';

export function DatosFactura({
  valor,
  onCambio,
}: {
  valor: DatosFiscales;
  onCambio: (d: DatosFiscales) => void;
}) {
  const puesto = (k: keyof DatosFiscales) => (e: React.ChangeEvent<HTMLInputElement>) =>
    onCambio({ ...valor, [k]: e.target.value });

  return (
    <div className="mt-3 rounded-xl border border-white/15 bg-superficie-2 p-3">
      <p className="text-[13px] font-bold text-white/85">¿Le hace falta la factura con sus datos?</p>
      <p className="mt-0.5 text-xs text-niebla">
        Si no te los da, sale como Consumidor Final. La factura sale igual.
      </p>
      <input className={`${campo} mt-2`} placeholder="RIF o cédula (J-12345678-9)" value={valor.rif} onChange={puesto('rif')} />
      {hayDatosFiscales(valor) && (
        <>
          <input className={`${campo} mt-2`} placeholder="Nombre o razón social" value={valor.razon} onChange={puesto('razon')} />
          <input className={`${campo} mt-2`} placeholder="Dirección (opcional)" value={valor.direccion} onChange={puesto('direccion')} />
          <input
            className={`${campo} mt-2`}
            placeholder="Correo para mandársela (opcional)"
            inputMode="email"
            value={valor.correo}
            onChange={puesto('correo')}
          />
        </>
      )}
    </div>
  );
}
