import { Stack } from "@mui/material";
import styled from "styled-components";
import { calcItem } from "../../../utils/presupuestoCalc";
import { ItemsTable } from "../POSAdmin/ItemsTable";
import { PresupuestoProductSearch } from "./PresupuestoProductSearch";

const CON_PRODUCTO = new Set(["PRODUCTO", "SERVICIO"]);

// Presupuesto guarda el IVA por categoría; la grilla de factura usa el porcentaje.
const IVA_CAT_TO_PCT = { IVA_10: 10, IVA_5: 5, EXENTO: 0 };
const PCT_TO_IVA_CAT = { 10: "IVA_10", 5: "IVA_5", 0: "EXENTO" };

export function ItemsEditor({ items, onChange, moneda = "PYG", disabled = false }) {
  const setItem = (idx, patch) => onChange(items.map((it, i) => (i === idx ? { ...it, ...patch } : it)));
  const removeItem = (idx) => onChange(items.filter((_, i) => i !== idx).map((it, i) => ({ ...it, orden: i + 1 })));

  // Producto agregado desde el buscador estilo compras → nueva fila
  const handleAddProduct = (prod) => {
    onChange([...items, { _key: crypto.randomUUID(), orden: items.length + 1, producto_id: prod.producto_id ?? null, ...prod }]);
  };

  // ItemsTable espera un objeto moneda; presupuesto maneja el código como string.
  const monedaObj =
    moneda && moneda !== "PYG"
      ? { moneda: { codigo: moneda, simbolo: moneda, posicion_simbolo: "L", decimales_estandar: 2 }, decimales_visualizar: 2 }
      : null;

  // Mapear los ítems del presupuesto al shape de la grilla de factura (solo display).
  // El descuento (en %) y el total se muestran calculados; la fuente de verdad
  // sigue siendo descuento_pct / iva_categoria para los totales del formulario.
  const tableItems = items.map((it) => {
    const tipo = it.tipo || "PRODUCTO";
    const aportaTotal = CON_PRODUCTO.has(tipo);
    const { subtotal_con_iva } = calcItem({
      tipo,
      cantidad: it.cantidad,
      precio_unitario: it.precio_unitario,
      descuento_pct: it.descuento_pct,
      descuento_monto: it.descuento_monto,
      iva_categoria: it.iva_categoria,
    });
    const cantidad = Number(it.cantidad) || 0;
    const bruto = (Number(it.precio_unitario) || 0) * cantidad;
    // Tipo de descuento derivado (UI): si hay monto > 0, es "monto"; si no, "porcentaje".
    const descuentoTipo = Number(it.descuento_monto) > 0 ? "monto" : it.descuento_tipo || "porcentaje";
    return {
      ...it,
      id: it._key,
      cod_producto: it.cod_producto || it.codigo || "S/C",
      porcentaje_iva: IVA_CAT_TO_PCT[it.iva_categoria] ?? 10,
      descuento_tipo: descuentoTipo,
      descuento_pct: Number(it.descuento_pct) || 0,
      descuento_monto: Number(it.descuento_monto) || 0,
      descuento_particular_precio_unitario_item: cantidad > 0 ? (bruto - subtotal_con_iva) / cantidad : 0,
      total_operacion_item: aportaTotal ? subtotal_con_iva : 0,
    };
  });

  // Normaliza el descuento del ítem para que SOLO uno (pct o monto) quede activo.
  // Así el backend (regla "monto si > 0, si no pct") siempre calcula lo correcto,
  // sin necesidad de persistir descuento_tipo.
  const handleUpdate = (idx, field, value) => {
    if (field === "porcentaje_iva") {
      setItem(idx, { iva_categoria: PCT_TO_IVA_CAT[value] ?? "IVA_10" });
    } else if (field === "descuento_tipo") {
      setItem(idx, value === "monto"
        ? { descuento_tipo: "monto", descuento_pct: 0 }
        : { descuento_tipo: "porcentaje", descuento_monto: 0 });
    } else if (field === "descuento_monto") {
      setItem(idx, { descuento_monto: Number(value) || 0, descuento_pct: 0, descuento_tipo: "monto" });
    } else if (field === "descuento_pct") {
      setItem(idx, { descuento_pct: Number(value) || 0, descuento_monto: 0, descuento_tipo: "porcentaje" });
    } else {
      setItem(idx, { [field]: value });
    }
  };

  return (
    <Stack spacing={1.5}>
      {!disabled && <PresupuestoProductSearch onAddItem={handleAddProduct} moneda={moneda} disabled={disabled} />}

      <InlineHint>Agregá los productos/servicios de este presupuesto desde la búsqueda rápida.</InlineHint>

      <ItemsTable
        items={tableItems}
        onUpdateItem={disabled ? undefined : handleUpdate}
        onRemoveItem={disabled ? undefined : removeItem}
        moneda={monedaObj}
        enableDiscounts
        editableDiscountPct={!disabled}
        editableDiscountAmount={!disabled}
      />
    </Stack>
  );
}

const InlineHint = styled.p`
  margin: 0 0 10px;
  font-size: 1.02rem;
  color: ${({ theme }) => theme.textSecondary || "#64748b"};
`;
