import {
  AssignmentTurnedIn,
  CheckCircle,
  Close,
  FolderOpen,
  Inventory2,
  Lock,
  Print,
  Search,
  Undo,
  Warehouse,
} from "@mui/icons-material";
import {
  Alert,
  Autocomplete,
  Box,
  Button,
  Checkbox,
  Chip,
  CircularProgress,
  Dialog,
  DialogActions,
  DialogContent,
  DialogTitle,
  Divider,
  FormControl,
  FormControlLabel,
  IconButton,
  InputAdornment,
  InputLabel,
  MenuItem,
  Paper,
  Select,
  Table,
  TableBody,
  TableCell,
  TableContainer,
  TableHead,
  TableRow,
  TextField,
  Tab,
  Tabs,
  Switch,
  ToggleButton,
  ToggleButtonGroup,
  Tooltip,
  Typography,
} from "@mui/material";
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
import { useCallback, useEffect, useMemo, useState } from "react";
import { toast } from "sonner";
import {
  cerrarSesion,
  cerrarZona,
  crearSesion,
  getProductosZona,
  getZonasAplicadas,
  listarSesiones,
  progresoPorZona,
  registrarConteo,
  eliminarConteo,
  getProductosNoContados,
} from "../../api/inventario-fisico.service";
import { getCategorias } from "../../api/categorias.service";
import { getMarcas } from "../../api/marcas.service";
import { getDepositos } from "../../api";
import { getErrorApi } from "../../utils/errorUtils";
import { escapeHtml } from "../_standards";

// ── Helpers ───────────────────────────────────────────────────────────────

function getPadreId(c) {
  return c.padre_id ?? c.padre?.id ?? null;
}

function buildCategoriasJerarquicas(categorias) {
  const padres = categorias.filter((c) => !getPadreId(c));
  const hijas = categorias.filter((c) => !!getPadreId(c));
  const result = [];
  for (const padre of padres) {
    const children = hijas.filter((h) => getPadreId(h) === padre.id);
    result.push({ ...padre, _esParent: true, _childrenIds: children.map((c) => c.id) });
    for (const child of children) {
      result.push({ ...child, _esParent: false, _childrenIds: [] });
    }
  }
  const sinPadre = hijas.filter((h) => !padres.find((p) => p.id === getPadreId(h)));
  for (const c of sinPadre) result.push({ ...c, _esParent: false, _childrenIds: [] });
  return result;
}

function imprimirPlanilla(deposito, categoria, productos) {
  const win = window.open("", "_blank");
  const fecha = new Date().toLocaleDateString("es-PY", { day: "2-digit", month: "2-digit", year: "numeric" });
  const rows = productos
    .map((p, i) => {
      const stock = p.stock_sistema ?? 0;
      const contado = p.contado ? p.cantidad_contada : null;
      const diff = contado !== null ? contado - stock : null;
      const diffStr = diff !== null
        ? `<span style="color:${diff === 0 ? "green" : diff > 0 ? "#1565c0" : "red"};font-weight:600">${diff > 0 ? "+" : ""}${diff}</span>`
        : "";
      return `<tr>
        <td style="text-align:center;padding:4px 6px;border-bottom:1px solid #eee">${i + 1}</td>
        <td style="font-family:monospace;font-size:11px;padding:4px 6px;border-bottom:1px solid #eee">${escapeHtml(p.cod_producto || "-")}</td>
        <td style="padding:4px 6px;border-bottom:1px solid #eee">${escapeHtml(p.descripcion)}</td>
        <td style="text-align:right;padding:4px 6px;border-bottom:1px solid #eee;color:#555">${stock}</td>
        <td style="text-align:right;width:130px;padding:4px 6px;border-bottom:1px solid #ccc">${contado !== null ? contado : "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"}</td>
        <td style="text-align:right;padding:4px 6px;border-bottom:1px solid #eee">${diffStr}</td>
      </tr>`;
    })
    .join("");
  win.document.write(`<!DOCTYPE html>
<html><head><meta charset="UTF-8"/><title>Planilla Inventario</title>
<style>
  body{font-family:Arial,sans-serif;font-size:12px;margin:20px;color:#222}
  h2{margin:0 0 2px;font-size:15px}
  .sub{color:#555;font-size:11px;margin-bottom:12px}
  table{width:100%;border-collapse:collapse}
  thead tr{background:#1a237e;color:#fff}
  thead th{padding:5px 6px;text-align:left;font-size:11px}
  tbody tr:nth-child(even){background:#f5f5f5}
  @media print{body{margin:10px}}
</style></head>
<body>
  <h2>Planilla de Inventario Físico</h2>
  <div class="sub">
    Depósito: <strong>${escapeHtml(deposito)}</strong> &nbsp;|&nbsp;
    Categoría: <strong>${escapeHtml(categoria || "Todas")}</strong> &nbsp;|&nbsp;
    Fecha: <strong>${escapeHtml(fecha)}</strong> &nbsp;|&nbsp;
    Responsable: _______________________
  </div>
  <table>
    <thead><tr>
      <th style="width:30px">#</th>
      <th style="width:110px">Código</th>
      <th>Descripción</th>
      <th style="width:90px;text-align:right">Stock sistema</th>
      <th style="width:120px;text-align:right">Cant. contada</th>
      <th style="width:80px;text-align:right">Diferencia</th>
    </tr></thead>
    <tbody>${rows}</tbody>
  </table>
</body></html>`);
  win.document.close();
  setTimeout(() => win.print(), 300);
}

// ── Progreso de zonas ─────────────────────────────────────────────────────

function ProgresoZonas({ sesion }) {
  const { data: zonas = [], isLoading } = useQuery({
    queryKey: ["inventario-progreso", sesion.id],
    queryFn: () => progresoPorZona(sesion.id),
    refetchInterval: 15000, // refresca cada 15s automáticamente
  });

  const totalContados = zonas.reduce((s, z) => s + z.productos_contados, 0);

  return (
    <Paper sx={{ p: 2 }}>
      <Box sx={{ display: "flex", alignItems: "center", justifyContent: "space-between", mb: 1 }}>
        <Typography variant="subtitle2">Progreso de zonas</Typography>
        {totalContados > 0 && (
          <Chip label={`${totalContados} productos`} size="small" color="primary" variant="outlined" />
        )}
      </Box>

      {isLoading ? (
        <CircularProgress size={16} />
      ) : zonas.length === 0 ? (
        <Typography variant="caption" color="text.secondary">
          Sin conteos registrados aún
        </Typography>
      ) : (
        <Box sx={{ display: "flex", flexDirection: "column", gap: 0.5 }}>
          {zonas.map((z, i) => (
            <Box
              key={i}
              sx={{
                display: "flex",
                alignItems: "flex-start",
                gap: 1,
                p: 1,
                borderRadius: 1,
                bgcolor: "action.hover",
                border: "1px solid",
                borderColor: "divider",
              }}
            >
              <Warehouse fontSize="small" color="primary" sx={{ mt: 0.2, flexShrink: 0 }} />
              <Box sx={{ flex: 1, minWidth: 0 }}>
                <Typography variant="caption" fontWeight={600} display="block" noWrap>
                  {z.deposito}
                </Typography>
                <Typography variant="caption" color="text.secondary" display="block" noWrap>
                  {z.categoria}
                </Typography>
              </Box>
              <Chip
                label={z.productos_contados}
                size="small"
                color="success"
                sx={{ fontSize: 11, height: 20 }}
              />
            </Box>
          ))}
        </Box>
      )}
    </Paper>
  );
}

// ── Panel de sesiones ─────────────────────────────────────────────────────

function SesionesPanel({ onSeleccionar, sesionActiva }) {
  const qc = useQueryClient();
  const [nombre, setNombre] = useState("");
  const [confirmCerrar, setConfirmCerrar] = useState(null);

  const { data: sesiones = [], isLoading } = useQuery({
    queryKey: ["inventario-sesiones"],
    queryFn: listarSesiones,
  });

  const crearMut = useMutation({
    mutationFn: () => crearSesion(nombre),
    onSuccess: () => {
      toast.success("Sesión creada");
      setNombre("");
      qc.invalidateQueries({ queryKey: ["inventario-sesiones"] });
    },
    onError: (e) => toast.error(getErrorApi(e)),
  });

  const cerrarMut = useMutation({
    mutationFn: (id) => cerrarSesion(id),
    onSuccess: () => {
      toast.success("Sesión cerrada — no se pueden agregar más conteos");
      setConfirmCerrar(null);
      qc.invalidateQueries({ queryKey: ["inventario-sesiones"] });
    },
    onError: (e) => toast.error(getErrorApi(e)),
  });

  return (
    <Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
      <Paper sx={{ p: 2 }}>
        <Typography variant="subtitle2" gutterBottom>
          Nueva sesión
        </Typography>
        <Box sx={{ display: "flex", gap: 1 }}>
          <TextField
            size="small"
            fullWidth
            placeholder="Ej: Inventario Mayo 2026"
            value={nombre}
            onChange={(e) => setNombre(e.target.value)}
            onKeyDown={(e) => e.key === "Enter" && nombre && crearMut.mutate()}
          />
          <Button
            variant="contained"
            disabled={!nombre || crearMut.isPending}
            onClick={() => crearMut.mutate()}
            size="small"
          >
            Crear
          </Button>
        </Box>
      </Paper>

      <Paper sx={{ p: 2 }}>
        <Typography variant="subtitle2" gutterBottom>
          Sesiones
        </Typography>
        {isLoading ? (
          <CircularProgress size={20} />
        ) : sesiones.length === 0 ? (
          <Typography variant="body2" color="text.secondary">
            No hay sesiones
          </Typography>
        ) : (
          sesiones.map((s) => (
            <Box
              key={s.id}
              sx={{
                display: "flex",
                alignItems: "center",
                gap: 1,
                py: 1,
                px: 1.5,
                mb: 0.5,
                borderRadius: 1,
                cursor: s.estado === "abierto" ? "pointer" : "default",
                bgcolor: sesionActiva?.id === s.id ? "primary.dark" : "background.paper",
                border: "1px solid",
                borderColor: sesionActiva?.id === s.id ? "primary.main" : "divider",
                "&:hover": s.estado === "abierto" ? { bgcolor: "action.hover" } : {},
              }}
              onClick={() => s.estado === "abierto" && onSeleccionar(s)}
            >
              {s.estado === "abierto" ? (
                <FolderOpen fontSize="small" color="primary" />
              ) : (
                <Lock fontSize="small" color="disabled" />
              )}
              <Box sx={{ flex: 1 }}>
                <Typography variant="body2" fontWeight={500}>
                  {s.nombre}
                </Typography>
                <Typography variant="caption" color="text.secondary">
                  {new Date(s.created_at).toLocaleDateString("es-PY")} —{" "}
                  {s._count?.conteos ?? 0} productos contados
                </Typography>
              </Box>
              <Chip
                label={s.estado}
                size="small"
                color={s.estado === "abierto" ? "success" : "default"}
              />
              {s.estado === "abierto" && (
                <Tooltip title="Cerrar sesión de inventario (ya no se podrán cargar más conteos)">
                  <Button
                    size="small"
                    color="warning"
                    variant="outlined"
                    onClick={(e) => {
                      e.stopPropagation();
                      setConfirmCerrar(s);
                    }}
                  >
                    <Lock fontSize="small" />
                  </Button>
                </Tooltip>
              )}
            </Box>
          ))
        )}
      </Paper>

      <Dialog open={!!confirmCerrar} onClose={() => setConfirmCerrar(null)}>
        <DialogTitle>Cerrar sesión de inventario</DialogTitle>
        <DialogContent>
          <Typography>
            ¿Cerrar la sesión <strong>{confirmCerrar?.nombre}</strong>?
          </Typography>
          <Alert severity="warning" sx={{ mt: 1 }}>
            Ya no se podrán cargar más conteos en esta sesión. Los conteos ya guardados quedan registrados.
          </Alert>
        </DialogContent>
        <DialogActions>
          <Button onClick={() => setConfirmCerrar(null)}>Cancelar</Button>
          <Button
            color="warning"
            variant="contained"
            onClick={() => cerrarMut.mutate(confirmCerrar.id)}
            disabled={cerrarMut.isPending}
          >
            Cerrar sesión
          </Button>
        </DialogActions>
      </Dialog>
    </Box>
  );
}

// ── Panel de conteo ───────────────────────────────────────────────────────

function ConteoPanel({ sesion }) {
  const qc = useQueryClient();
  const [depositoId, setDepositoId] = useState("");
  const [categoriasSeleccionadas, setCategoriasSeleccionadas] = useState([]);
  const [marcasSeleccionadas, setMarcasSeleccionadas] = useState([]);
  const [filtroConteo, setFiltroConteo] = useState("todos"); // 'todos' | 'contados' | 'pendientes'
  const [busqueda, setBusqueda] = useState("");
  const [debouncedBusqueda, setDebouncedBusqueda] = useState("");
  const [cantidades, setCantidades] = useState({});
  const [confirmAjuste, setConfirmAjuste] = useState(false);
  const [mantenerStockNoContados, setMantenerStockNoContados] = useState(false);
  const [skip, setSkip] = useState(0);
  const take = 50;

  useEffect(() => {
    const t = setTimeout(() => setDebouncedBusqueda(busqueda), 350);
    return () => clearTimeout(t);
  }, [busqueda]);

  const categoriaId = categoriasSeleccionadas.map((c) => c.id).join(",");
  const marcaId = marcasSeleccionadas.map((m) => m.id).join(",");

  const { data: depositosData = [] } = useQuery({
    queryKey: ["depositos"],
    queryFn: () => getDepositos(),
    select: (d) => d?.data ?? d ?? [],
  });

  const { data: categoriasData } = useQuery({
    queryKey: ["categorias-all"],
    queryFn: () => getCategorias(1, 500),
  });

  const categoriasJerarquicas = useMemo(
    () => buildCategoriasJerarquicas(categoriasData?.data ?? []),
    [categoriasData]
  );

  const { data: marcasData } = useQuery({
    queryKey: ["marcas-all"],
    queryFn: () => getMarcas(),
    select: (d) => (d?.data ?? d ?? []).filter((m) => m.active !== false),
  });

  const { data: zonaData, isLoading: loadingProductos } = useQuery({
    queryKey: ["productos-zona", sesion.id, depositoId, categoriaId, marcaId, debouncedBusqueda, skip, filtroConteo],
    queryFn: () =>
      getProductosZona({
        sesionId: sesion.id,
        depositoId: depositoId || undefined,
        categoriaId: categoriaId || undefined,
        marcaId: marcaId || undefined,
        busqueda: debouncedBusqueda || undefined,
        filtro: filtroConteo !== "todos" ? filtroConteo : undefined,
        skip,
        take,
      }),
  });

  const productos = zonaData?.data ?? [];
  const total = zonaData?.total ?? 0;

  // Historial de aplicaciones de ajuste por zona (append-only).
  // Lo usamos para avisar al operador si la zona actual ya fue ajustada.
  const { data: zonasAplicadas = [] } = useQuery({
    queryKey: ["inventario-zonas-aplicadas", sesion.id],
    queryFn: () => getZonasAplicadas(sesion.id),
    enabled: !!sesion.id,
  });

  // Aplicaciones previas que matchean depósito + categoría seleccionados ahora.
  // categoria_id null en BD = "todas las categorías" — debe coincidir literalmente.
  const aplicacionesZonaActual = useMemo(() => {
    if (!depositoId) return [];
    const catActual = categoriaId || null;
    return zonasAplicadas.filter(
      (z) => z.deposito_id === depositoId && (z.categoria_id ?? null) === catActual,
    );
  }, [zonasAplicadas, depositoId, categoriaId]);
  const yaAplicada = aplicacionesZonaActual.length > 0;
  const ultimaAplicacion = aplicacionesZonaActual[0]; // ya viene desc por aplicada_at

  const guardarMut = useMutation({
    mutationFn: ({ productoId, cantidad, catId }) =>
      registrarConteo(sesion.id, {
        deposito_id: depositoId,
        categoria_id: catId || undefined,
        producto_id: productoId,
        cantidad_contada: parseFloat(cantidad),
      }),
    onSuccess: () => {
      qc.invalidateQueries({ queryKey: ["productos-zona"] });
      qc.invalidateQueries({ queryKey: ["inventario-sesiones"] });
      qc.invalidateQueries({ queryKey: ["inventario-progreso"] });
    },
    onError: (e) => toast.error(getErrorApi(e)),
  });

  const deshacerMut = useMutation({
    mutationFn: (productoId) => eliminarConteo(sesion.id, productoId, depositoId),
    onSuccess: (_, productoId) => {
      setCantidades((prev) => { const n = { ...prev }; delete n[productoId]; return n; });
      qc.invalidateQueries({ queryKey: ["productos-zona"] });
      qc.invalidateQueries({ queryKey: ["inventario-progreso"] });
      toast.success("Conteo eliminado");
    },
    onError: (e) => toast.error(getErrorApi(e)),
  });

  const ajusteMut = useMutation({
    mutationFn: () =>
      cerrarZona(sesion.id, {
        deposito_id: depositoId,
        categoria_id: categoriaId || undefined,
        mantener_stock_no_contados: mantenerStockNoContados,
      }),
    onSuccess: (res) => {
      toast.success(
        mantenerStockNoContados
          ? `Ajuste aplicado: ${res.contados} productos contados actualizados. ${res.en_cero} sin contar (stock conservado). Total: ${res.total_productos}.`
          : `Ajuste aplicado: ${res.contados} con stock real, ${res.en_cero} en cero. Total: ${res.total_productos} productos.`
      );
      setConfirmAjuste(false);
      setCantidades({});
      qc.invalidateQueries({ queryKey: ["productos-zona"] });
      qc.invalidateQueries({ queryKey: ["inventario-sesiones"] });
      qc.invalidateQueries({ queryKey: ["inventario-progreso"] });
      qc.invalidateQueries({ queryKey: ["inventario-zonas-aplicadas", sesion.id] });
    },
    onError: (e) => toast.error(getErrorApi(e)),
  });

  // Auto-guardado al salir del campo (onBlur)
  const handleBlurGuardar = useCallback(
    (p, val) => {
      if (val === "" || val === undefined) return;
      if (!depositoId) { toast.warning("Seleccioná un depósito para registrar el conteo"); return; }
      if (p.contado && String(p.cantidad_contada) === val) return; // sin cambio
      guardarMut.mutate({
        productoId: p.id,
        cantidad: val,
        catId: p.categoria_id || categoriaId,
      });
    },
    [depositoId, categoriaId, guardarMut]
  );

  const deposito = depositosData.find((d) => d.id === depositoId);

  return (
    <Box sx={{ display: "flex", flexDirection: "column", gap: 2 }}>
      {/* Barra de filtros */}
      <Paper sx={{ p: 2 }}>
        <Typography variant="subtitle1" fontWeight={600} gutterBottom>
          Sesión: {sesion.nombre}
        </Typography>
        <Box sx={{ display: "flex", gap: 1.5, flexWrap: "wrap", alignItems: "center" }}>
          {/* Depósito */}
          <FormControl size="small" sx={{ minWidth: 200 }}>
            <InputLabel>Depósito</InputLabel>
            <Select
              value={depositoId}
              label="Depósito"
              onChange={(e) => {
                setDepositoId(e.target.value);
                setSkip(0);
                setCantidades({});
              }}
            >
              <MenuItem value=""><em>Todos los depósitos</em></MenuItem>
              {depositosData.map((d) => (
                <MenuItem key={d.id} value={d.id}>
                  {d.descripcion}
                </MenuItem>
              ))}
            </Select>
          </FormControl>

          {/* Categoría — multi-select con jerarquía */}
          <Autocomplete
            multiple
            disableCloseOnSelect
            size="small"
            options={categoriasJerarquicas}
            getOptionLabel={(o) => o.descripcion ?? ""}
            value={categoriasSeleccionadas}
            onChange={(_, newValue, reason, details) => {
              const opt = details?.option;
              let next = newValue;
              if (opt && opt._esParent && opt._childrenIds?.length > 0) {
                const adding = newValue.some((v) => v.id === opt.id);
                if (adding) {
                  // Agregar padre + todos sus hijos
                  const hijos = categoriasJerarquicas.filter((c) => opt._childrenIds.includes(c.id));
                  const merged = [...newValue];
                  for (const h of hijos) {
                    if (!merged.find((m) => m.id === h.id)) merged.push(h);
                  }
                  next = merged;
                } else {
                  // Quitar padre + todos sus hijos
                  const removeIds = new Set([opt.id, ...opt._childrenIds]);
                  next = newValue.filter((v) => !removeIds.has(v.id));
                }
              }
              setCategoriasSeleccionadas(next);
              setSkip(0);
              setCantidades({});
            }}
            isOptionEqualToValue={(a, b) => a.id === b.id}
            renderOption={(props, o, { selected }) => {
              const { key, ...rest } = props;
              return (
                <li key={key} {...rest} style={{ paddingLeft: o._esParent ? 8 : 20 }}>
                  <Checkbox
                    size="small"
                    checked={selected}
                    indeterminate={
                      o._esParent &&
                      o._childrenIds?.length > 0 &&
                      !selected &&
                      o._childrenIds.some((id) => categoriasSeleccionadas.some((c) => c.id === id))
                    }
                    sx={{ mr: 0.5, p: 0.5 }}
                  />
                  {o._esParent ? (
                    <Typography fontWeight={700} fontSize={13} color="primary.light">
                      {o.descripcion}
                    </Typography>
                  ) : (
                    <Typography fontSize={12.5} color="text.secondary">
                      └ {o.descripcion}
                    </Typography>
                  )}
                </li>
              );
            }}
            renderTags={(value, getTagProps) => {
              if (value.length === 0) return null;
              if (value.length > 2) {
                return (
                  <Chip
                    label={`${value.length} categorías`}
                    size="small"
                    color="primary"
                    onDelete={() => { setCategoriasSeleccionadas([]); setSkip(0); setCantidades({}); }}
                  />
                );
              }
              return value.map((opt, idx) => (
                <Chip
                  key={opt.id}
                  label={opt.descripcion}
                  size="small"
                  color={opt._esParent ? "primary" : "default"}
                  {...getTagProps({ index: idx })}
                />
              ));
            }}
            renderInput={(params) => (
              <TextField
                {...params}
                label={categoriasSeleccionadas.length ? `Categorías (${categoriasSeleccionadas.length})` : "Categoría (todas)"}
              />
            )}
            sx={{ minWidth: 240 }}
            clearOnEscape
            noOptionsText="Sin resultados"
            limitTags={2}
          />

          {/* Marca — multi-select */}
          <Autocomplete
            multiple
            disableCloseOnSelect
            size="small"
            options={marcasData ?? []}
            getOptionLabel={(o) => o.descripcion ?? ""}
            value={marcasSeleccionadas}
            onChange={(_, newValue) => {
              setMarcasSeleccionadas(newValue);
              setSkip(0);
              setCantidades({});
            }}
            isOptionEqualToValue={(a, b) => a.id === b.id}
            renderOption={(props, o, { selected }) => {
              const { key, ...rest } = props;
              return (
                <li key={key} {...rest}>
                  <Checkbox size="small" checked={selected} sx={{ mr: 0.5, p: 0.5 }} />
                  <Typography fontSize={12.5}>{o.descripcion}</Typography>
                </li>
              );
            }}
            renderTags={(value, getTagProps) => {
              if (value.length > 2) {
                return (
                  <Chip
                    label={`${value.length} marcas`}
                    size="small"
                    color="secondary"
                    onDelete={() => { setMarcasSeleccionadas([]); setSkip(0); setCantidades({}); }}
                  />
                );
              }
              return value.map((opt, idx) => (
                <Chip key={opt.id} label={opt.descripcion} size="small" {...getTagProps({ index: idx })} />
              ));
            }}
            renderInput={(params) => (
              <TextField
                {...params}
                label={marcasSeleccionadas.length ? `Marcas (${marcasSeleccionadas.length})` : "Marca (todas)"}
              />
            )}
            sx={{ minWidth: 200 }}
            clearOnEscape
            noOptionsText="Sin resultados"
            limitTags={2}
          />

          {/* Buscador — ocupa el espacio restante */}
          <TextField
            size="small"
            placeholder="Buscar por código o descripción"
            value={busqueda}
            onChange={(e) => {
              setBusqueda(e.target.value);
              setSkip(0); // resetea paginación inmediatamente al escribir
            }}
            sx={{ flex: 1, minWidth: 220 }}
            InputProps={{
              startAdornment: (
                <InputAdornment position="start">
                  {busqueda !== debouncedBusqueda ? (
                    <CircularProgress size={16} />
                  ) : (
                    <Search fontSize="small" />
                  )}
                </InputAdornment>
              ),
            }}
          />

          <Button
            variant="outlined"
            size="small"
            startIcon={<Print />}
            disabled={!depositoId || productos.length === 0}
            onClick={() =>
              imprimirPlanilla(
                deposito?.descripcion ?? "Todos los depósitos",
                categoriasSeleccionadas.map((c) => c.descripcion).join(", ") || undefined,
                productos
              )
            }
          >
            Imprimir planilla
          </Button>

          <Tooltip
            title={
              !depositoId
                ? "Seleccioná un depósito para aplicar ajuste"
                : yaAplicada
                  ? `Esta zona ya fue ajustada ${aplicacionesZonaActual.length} ${aplicacionesZonaActual.length === 1 ? "vez" : "veces"}. La última: ${new Date(ultimaAplicacion.aplicada_at).toLocaleString("es-PY")}${ultimaAplicacion.aplicada_por_nombre ? ` por ${ultimaAplicacion.aplicada_por_nombre}` : ""}. Podés re-aplicar con los conteos actuales.`
                  : "Aplica el ajuste de stock para esta zona: los productos contados se actualizan con la cantidad ingresada y los NO contados quedan en 0. No cierra la sesión."
            }
            placement="bottom"
          >
            <span>
              <Button
                variant={yaAplicada ? "outlined" : "contained"}
                color={yaAplicada ? "success" : "warning"}
                size="small"
                startIcon={<AssignmentTurnedIn />}
                disabled={!depositoId}
                onClick={() => setConfirmAjuste(true)}
              >
                {yaAplicada ? "Re-aplicar ajuste de zona" : "Aplicar ajuste de zona"}
              </Button>
            </span>
          </Tooltip>
        </Box>
      </Paper>

      {!depositoId && (
        <Alert severity="info" sx={{ mb: 0 }}>
          Modo visualización — seleccioná un depósito para poder registrar conteos.
        </Alert>
      )}
      {loadingProductos ? (
        <Box sx={{ display: "flex", justifyContent: "center", p: 4 }}>
          <CircularProgress />
        </Box>
      ) : (
        <>
          <Box sx={{ display: "flex", justifyContent: "space-between", alignItems: "center", flexWrap: "wrap", gap: 1 }}>
            <Box sx={{ display: "flex", alignItems: "center", gap: 1, flexWrap: "wrap" }}>
              <Typography variant="body2" color="text.secondary">
                {total} productos en esta zona
              </Typography>
              <Chip
                label="Los cambios se guardan automáticamente al salir del campo"
                size="small"
                color="info"
                variant="outlined"
                sx={{ fontSize: 11 }}
              />
              <ToggleButtonGroup
                size="small"
                exclusive
                value={filtroConteo}
                onChange={(_, v) => { if (v) { setFiltroConteo(v); setSkip(0); } }}
                sx={{ height: 28 }}
              >
                <ToggleButton value="todos" sx={{ px: 1.5, fontSize: 11 }}>Todos</ToggleButton>
                <ToggleButton value="contados" sx={{ px: 1.5, fontSize: 11 }}>Contados</ToggleButton>
                <ToggleButton value="pendientes" sx={{ px: 1.5, fontSize: 11 }}>Pendientes</ToggleButton>
              </ToggleButtonGroup>
            </Box>
            <Box sx={{ display: "flex", gap: 1, alignItems: "center" }}>
              <Button size="small" disabled={skip === 0} onClick={() => setSkip(Math.max(0, skip - take))}>
                ← Anterior
              </Button>
              <Typography variant="body2">
                {skip + 1}–{Math.min(skip + take, total)} de {total}
              </Typography>
              <Button
                size="small"
                disabled={skip + take >= total}
                onClick={() => setSkip(prev => prev + take)}
              >
                Siguiente →
              </Button>
            </Box>
          </Box>

          <TableContainer component={Paper} sx={{ overflowX: "auto" }}>
            <Table size="small" sx={{ minWidth: 720 }}>
              <TableHead>
                <TableRow>
                  <TableCell sx={{ width: 110 }}>Código</TableCell>
                  <TableCell>Descripción</TableCell>
                  <TableCell sx={{ width: 120 }}>Marca</TableCell>
                  <TableCell align="center" sx={{ width: 90 }}>Estado</TableCell>
                  <TableCell align="right" sx={{ width: 90 }}>Stock</TableCell>
                  <TableCell align="right" sx={{ width: 140 }}>Cant. contada</TableCell>
                  <TableCell align="right" sx={{ width: 80 }}>Dif.</TableCell>
                </TableRow>
              </TableHead>
              <TableBody>
                {productos.map((p) => {
                  const yaContado = p.contado;
                  const val =
                    cantidades[p.id] !== undefined
                      ? cantidades[p.id]
                      : yaContado
                      ? String(p.cantidad_contada)
                      : "";
                  const contadoNum = val !== "" ? parseFloat(val) : null;
                  const stockSistema = p.stock_sistema ?? 0;
                  const diff = contadoNum !== null ? contadoNum - stockSistema : null;
                  return (
                    <TableRow
                      key={p.id}
                      sx={{ bgcolor: yaContado ? "rgba(46,125,50,0.15)" : "inherit" }}
                    >
                      <TableCell>
                        <Typography variant="caption" color="text.secondary">
                          {p.cod_producto || "—"}
                        </Typography>
                      </TableCell>
                      <TableCell>{p.descripcion}</TableCell>
                      <TableCell>
                        <Typography variant="caption" color="text.secondary">
                          {p.marcas?.descripcion ?? "—"}
                        </Typography>
                      </TableCell>
                      <TableCell align="center">
                        {yaContado ? (
                          <Box sx={{ display: "flex", alignItems: "center", justifyContent: "center", gap: 0.5 }}>
                            <Tooltip title={`Contado: ${p.cantidad_contada}`}>
                              <CheckCircle fontSize="small" color="success" />
                            </Tooltip>
                            {depositoId && (
                              <Tooltip title="Deshacer conteo">
                                <IconButton
                                  size="small"
                                  color="warning"
                                  disabled={deshacerMut.isPending}
                                  onClick={() => deshacerMut.mutate(p.id)}
                                  sx={{ p: 0.25 }}
                                >
                                  <Undo sx={{ fontSize: 15 }} />
                                </IconButton>
                              </Tooltip>
                            )}
                          </Box>
                        ) : (
                          <Close fontSize="small" color="disabled" />
                        )}
                      </TableCell>
                      <TableCell align="right">
                        <Typography variant="body2" color="text.secondary" fontFamily="monospace">
                          {stockSistema}
                        </Typography>
                      </TableCell>
                      <TableCell align="right">
                        <TextField
                          size="small"
                          type="number"
                          value={val}
                          onChange={(e) =>
                            setCantidades((prev) => ({ ...prev, [p.id]: e.target.value }))
                          }
                          onBlur={() => handleBlurGuardar(p, val)}
                          onKeyDown={(e) => {
                            if (e.key === "Enter") {
                              handleBlurGuardar(p, val);
                              const inputs = document.querySelectorAll("input[type=number]");
                              const idx = Array.from(inputs).indexOf(e.target);
                              if (idx >= 0 && inputs[idx + 1]) inputs[idx + 1].focus();
                            }
                          }}
                          inputProps={{ min: 0, step: 1, style: { textAlign: "right" } }}
                          sx={{ width: 120 }}
                        />
                      </TableCell>
                      <TableCell align="right">
                        {diff !== null && (
                          <Typography
                            variant="body2"
                            fontWeight={600}
                            fontFamily="monospace"
                            color={diff === 0 ? "success.main" : diff > 0 ? "primary.main" : "error.main"}
                          >
                            {diff > 0 ? `+${diff}` : diff}
                          </Typography>
                        )}
                      </TableCell>
                    </TableRow>
                  );
                })}
              </TableBody>
            </Table>
          </TableContainer>
        </>
      )}

      {/* Diálogo aplicar ajuste de zona */}
      <Dialog open={confirmAjuste} onClose={() => setConfirmAjuste(false)} maxWidth="sm" fullWidth>
        <DialogTitle>
          {yaAplicada ? "Re-aplicar ajuste de stock — zona" : "Aplicar ajuste de stock — zona"}
        </DialogTitle>
        <DialogContent>
          <Typography gutterBottom>
            Se ajustará el stock del depósito <strong>{deposito?.descripcion}</strong>
            {categoriasSeleccionadas.length > 0 ? `, ${categoriasSeleccionadas.length === 1 ? `categoría ${categoriasSeleccionadas[0].descripcion}` : `${categoriasSeleccionadas.length} categorías`}` : " (todas las categorías)"}.
          </Typography>

          {yaAplicada && (
            <Alert severity="warning" sx={{ mt: 1, mb: 1 }}>
              <strong>Esta zona ya fue ajustada {aplicacionesZonaActual.length} {aplicacionesZonaActual.length === 1 ? "vez" : "veces"}.</strong>
              <br />
              Última aplicación: {new Date(ultimaAplicacion.aplicada_at).toLocaleString("es-PY")}
              {ultimaAplicacion.aplicada_por_nombre ? ` por ${ultimaAplicacion.aplicada_por_nombre}` : ""}
              {" · "}
              {ultimaAplicacion.contados} de {ultimaAplicacion.total_productos} contados.
              <br />
              Si re-aplicás, el stock se recalculará con los conteos actuales (los previos quedan sobreescritos).
            </Alert>
          )}

          {yaAplicada && aplicacionesZonaActual.length > 1 && (
            <Box sx={{ mt: 1, mb: 1, maxHeight: 140, overflowY: "auto", border: 1, borderColor: "divider", borderRadius: 1, p: 1 }}>
              <Typography variant="caption" fontWeight={700} color="text.secondary" display="block" gutterBottom>
                Historial de aplicaciones
              </Typography>
              {aplicacionesZonaActual.map((a) => (
                <Box key={a.id} sx={{ display: "flex", justifyContent: "space-between", py: 0.25, fontSize: 12 }}>
                  <span>
                    {new Date(a.aplicada_at).toLocaleString("es-PY")}
                    {a.aplicada_por_nombre ? ` — ${a.aplicada_por_nombre}` : ""}
                  </span>
                  <span style={{ color: "#64748b" }}>
                    {a.contados}/{a.total_productos}
                  </span>
                </Box>
              ))}
            </Box>
          )}

          <Box sx={{ border: 1, borderColor: "divider", borderRadius: 1, px: 2, py: 1, mt: 1.5 }}>
            <FormControlLabel
              control={
                <Switch
                  checked={mantenerStockNoContados}
                  onChange={(e) => setMantenerStockNoContados(e.target.checked)}
                  color="primary"
                />
              }
              label={
                <Box>
                  <Typography variant="body2" fontWeight={600}>
                    Mantener stock de productos no contados
                  </Typography>
                  <Typography variant="caption" color="text.secondary">
                    {mantenerStockNoContados
                      ? "Los productos sin conteo conservarán su stock actual en sistema"
                      : "Los productos sin conteo quedarán con stock = 0"}
                  </Typography>
                </Box>
              }
            />
          </Box>

          <Alert severity={mantenerStockNoContados ? "info" : "warning"} sx={{ mt: 1.5 }}>
            <strong>Resultado:</strong>
            <br />• Productos contados → stock = cantidad ingresada
            <br />• Productos NO contados → {mantenerStockNoContados ? "stock sin cambios" : "stock = 0"}
            <br />• La sesión <strong>no</strong> se cierra, podés seguir contando otras zonas.
          </Alert>
        </DialogContent>
        <DialogActions>
          <Button onClick={() => setConfirmAjuste(false)}>Cancelar</Button>
          <Button
            color="warning"
            variant="contained"
            onClick={() => ajusteMut.mutate()}
            disabled={ajusteMut.isPending}
          >
            Confirmar ajuste
          </Button>
        </DialogActions>
      </Dialog>
    </Box>
  );
}

// ── Tab principal ─────────────────────────────────────────────────────────

// ── Panel de productos NO contados ────────────────────────────────────────

function FaltantesPanel({ sesion }) {
  const [depositoId, setDepositoId] = useState("");
  const [categoriasSeleccionadas, setCategoriasSeleccionadas] = useState([]);
  const [busqueda, setBusqueda] = useState("");
  const [debouncedBusqueda, setDebouncedBusqueda] = useState("");
  const [skip, setSkip] = useState(0);
  const [imprimiendo, setImprimiendo] = useState(false);
  const take = 50;

  useEffect(() => {
    const t = setTimeout(() => setDebouncedBusqueda(busqueda), 350);
    return () => clearTimeout(t);
  }, [busqueda]);

  const { data: depositosData = [] } = useQuery({
    queryKey: ["depositos"],
    queryFn: () => getDepositos(),
    select: (d) => d?.data ?? d ?? [],
  });

  const { data: categoriasData } = useQuery({
    queryKey: ["categorias-all"],
    queryFn: () => getCategorias(1, 500),
  });

  const categoriasJerarquicas = useMemo(
    () => buildCategoriasJerarquicas(categoriasData?.data ?? []),
    [categoriasData]
  );

  const categoriaId = categoriasSeleccionadas.map((c) => c.id).join(",");

  const { data, isLoading } = useQuery({
    queryKey: ["no-contados", sesion.id, depositoId, categoriaId, debouncedBusqueda, skip],
    queryFn: () =>
      getProductosNoContados(sesion.id, {
        depositoId: depositoId || undefined,
        categoriaId: categoriaId || undefined,
        busqueda: debouncedBusqueda || undefined,
        skip,
        take,
      }),
  });

  const productos = data?.data ?? [];
  const total = data?.total ?? 0;
  const totalPages = Math.ceil(total / take);
  const page = Math.floor(skip / take) + 1;

  const handleImprimirPdf = async () => {
    setImprimiendo(true);
    try {
      let todos = [];
      let s = 0;
      const t = 500;
      while (true) {
        const r = await getProductosNoContados(sesion.id, {
          depositoId: depositoId || undefined,
          categoriaId: categoriaId || undefined,
          busqueda: debouncedBusqueda || undefined,
          skip: s,
          take: t,
        });
        todos = [...todos, ...(r?.data ?? [])];
        if (todos.length >= (r?.total ?? 0)) break;
        s += t;
      }

      const depositoLabel = depositosData.find((d) => d.id === depositoId)?.descripcion ?? "Todos los depósitos";
      const categLabel = categoriasSeleccionadas.length
        ? categoriasSeleccionadas.map((c) => c.descripcion).join(", ")
        : "Todas las categorías";
      const fecha = new Date().toLocaleDateString("es-PY", { day: "2-digit", month: "2-digit", year: "numeric" });

      const filas = todos
        .map(
          (p, i) => `
          <tr>
            <td style="padding:3px 6px;border-bottom:1px solid #eee;text-align:center;">${i + 1}</td>
            <td style="padding:3px 6px;border-bottom:1px solid #eee;font-family:monospace;font-size:11px;">${p.cod_producto ?? ""}</td>
            <td style="padding:3px 6px;border-bottom:1px solid #eee;">${p.descripcion ?? ""}</td>
            <td style="padding:3px 6px;border-bottom:1px solid #eee;color:#666;">${p.categoria ?? ""}</td>
            <td style="padding:3px 6px;border-bottom:1px solid #eee;text-align:right;font-weight:600;color:${(p.stock_sistema ?? 0) > 0 ? "#c62828" : "#555"};">${p.stock_sistema ?? 0}</td>
          </tr>`
        )
        .join("");

      const html = `<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8"/>
  <title>Productos no contados — ${sesion.nombre}</title>
  <style>
    body { font-family: Arial, sans-serif; font-size: 12px; margin: 20px; color: #222; }
    h2 { margin: 0 0 2px; font-size: 16px; }
    .sub { color: #555; font-size: 11px; margin-bottom: 12px; }
    table { width: 100%; border-collapse: collapse; }
    thead tr { background: #1a237e; color: #fff; }
    thead th { padding: 5px 6px; text-align: left; font-size: 11px; }
    tbody tr:nth-child(even) { background: #f5f5f5; }
    tfoot td { font-weight: bold; padding: 6px; border-top: 2px solid #1a237e; }
    @media print { body { margin: 10px; } }
  </style>
</head>
<body>
  <h2>Inventario Físico — Productos No Contados</h2>
  <div class="sub">
    Sesión: <strong>${sesion.nombre}</strong> &nbsp;|&nbsp;
    Depósito: <strong>${depositoLabel}</strong> &nbsp;|&nbsp;
    Categoría: <strong>${categLabel}</strong> &nbsp;|&nbsp;
    Fecha: <strong>${fecha}</strong>
  </div>
  <table>
    <thead>
      <tr>
        <th style="width:30px">#</th>
        <th style="width:110px">Código</th>
        <th>Descripción</th>
        <th style="width:150px">Categoría</th>
        <th style="width:90px;text-align:right">Stock sistema</th>
      </tr>
    </thead>
    <tbody>${filas}</tbody>
    <tfoot>
      <tr>
        <td colspan="3">Total no contados: ${todos.length} productos</td>
        <td colspan="2" style="text-align:right">Stock acumulado: ${todos.reduce((s, p) => s + (p.stock_sistema ?? 0), 0)}</td>
      </tr>
    </tfoot>
  </table>
</body>
</html>`;

      const win = window.open("", "_blank");
      win.document.write(html);
      win.document.close();
      win.focus();
      setTimeout(() => win.print(), 400);
    } catch (e) {
      toast.error("Error al generar el PDF");
    } finally {
      setImprimiendo(false);
    }
  };

  return (
    <Box>
      {/* Barra de filtros */}
      <Box sx={{ display: "flex", gap: 1.5, flexWrap: "wrap", alignItems: "center", mb: 2 }}>
        <FormControl size="small" sx={{ minWidth: 180 }}>
          <InputLabel>Depósito</InputLabel>
          <Select
            value={depositoId}
            label="Depósito"
            onChange={(e) => { setDepositoId(e.target.value); setSkip(0); }}
          >
            <MenuItem value="">Todos</MenuItem>
            {depositosData.map((d) => (
              <MenuItem key={d.id} value={d.id}>{d.descripcion}</MenuItem>
            ))}
          </Select>
        </FormControl>

        <Autocomplete
          multiple
          disableCloseOnSelect
          size="small"
          options={categoriasJerarquicas}
          getOptionLabel={(o) => o.descripcion ?? ""}
          value={categoriasSeleccionadas}
          onChange={(_, newValue, _reason, details) => {
            const opt = details?.option;
            let next = newValue;
            if (opt?._esParent && opt._childrenIds?.length > 0) {
              const adding = newValue.some((v) => v.id === opt.id);
              if (adding) {
                const hijos = categoriasJerarquicas.filter((c) => opt._childrenIds.includes(c.id));
                const merged = [...newValue];
                for (const h of hijos) { if (!merged.find((m) => m.id === h.id)) merged.push(h); }
                next = merged;
              } else {
                const removeIds = new Set([opt.id, ...opt._childrenIds]);
                next = newValue.filter((v) => !removeIds.has(v.id));
              }
            }
            setCategoriasSeleccionadas(next);
            setSkip(0);
          }}
          isOptionEqualToValue={(a, b) => a.id === b.id}
          renderOption={(props, o, { selected }) => {
            const { key, ...rest } = props;
            return (
              <li key={key} {...rest} style={{ paddingLeft: o._esParent ? 8 : 20 }}>
                <Checkbox size="small" checked={selected} sx={{ mr: 0.5, p: 0.5 }} />
                {o._esParent
                  ? <Typography fontWeight={700} fontSize={13} color="primary.light">{o.descripcion}</Typography>
                  : <Typography fontSize={12.5} color="text.secondary">└ {o.descripcion}</Typography>}
              </li>
            );
          }}
          renderTags={(value) => value.length > 2
            ? <Chip label={`${value.length} categorías`} size="small" color="primary" onDelete={() => { setCategoriasSeleccionadas([]); setSkip(0); }} />
            : value.map((opt, idx) => <Chip key={opt.id} label={opt.descripcion} size="small" color={opt._esParent ? "primary" : "default"} onDelete={() => { setCategoriasSeleccionadas((prev) => prev.filter((c) => c.id !== opt.id)); setSkip(0); }} />)
          }
          renderInput={(params) => (
            <TextField {...params} label={categoriasSeleccionadas.length ? `Categorías (${categoriasSeleccionadas.length})` : "Categoría (todas)"} />
          )}
          sx={{ minWidth: 240 }}
          noOptionsText="Sin resultados"
          limitTags={2}
        />

        <TextField
          size="small"
          placeholder="Buscar por código o descripción"
          value={busqueda}
          onChange={(e) => { setBusqueda(e.target.value); setSkip(0); }}
          sx={{ flex: 1, minWidth: 200 }}
          slotProps={{ input: { startAdornment: <InputAdornment position="start"><Search fontSize="small" /></InputAdornment> } }}
        />
      </Box>

      {/* Contador + botón imprimir */}
      <Box sx={{ display: "flex", alignItems: "center", gap: 1, mb: 1.5 }}>
        <Chip
          label={isLoading ? "Cargando..." : `${total} productos no contados`}
          color={total > 0 ? "warning" : "success"}
          size="small"
          icon={<AssignmentTurnedIn fontSize="small" />}
        />
        {total === 0 && !isLoading && (
          <Typography variant="body2" color="success.main">¡Todos los productos fueron contados!</Typography>
        )}
        <Box sx={{ flex: 1 }} />
        <Tooltip title="Imprimir / Guardar PDF con todos los productos no contados">
          <span>
            <Button
              size="small"
              variant="outlined"
              startIcon={<Print fontSize="small" />}
              onClick={handleImprimirPdf}
              disabled={imprimiendo || isLoading || total === 0}
            >
              {imprimiendo ? "Cargando..." : "Imprimir PDF"}
            </Button>
          </span>
        </Tooltip>
      </Box>

      {/* Tabla */}
      <TableContainer component={Paper} sx={{ maxHeight: "calc(100vh - 320px)" }}>
        <Table size="small" stickyHeader>
          <TableHead>
            <TableRow>
              <TableCell sx={{ fontWeight: 700 }}>Código</TableCell>
              <TableCell sx={{ fontWeight: 700 }}>Descripción</TableCell>
              <TableCell sx={{ fontWeight: 700 }}>Categoría</TableCell>
            </TableRow>
          </TableHead>
          <TableBody>
            {isLoading ? (
              <TableRow>
                <TableCell colSpan={3} align="center" sx={{ py: 4 }}>
                  <CircularProgress size={24} />
                </TableCell>
              </TableRow>
            ) : productos.length === 0 ? (
              <TableRow>
                <TableCell colSpan={3} align="center" sx={{ py: 4, color: "text.secondary" }}>
                  {total === 0 ? "Sin productos faltantes" : "Sin resultados para la búsqueda"}
                </TableCell>
              </TableRow>
            ) : (
              productos.map((p) => (
                <TableRow key={p.id} hover>
                  <TableCell sx={{ fontFamily: "monospace", fontSize: 12 }}>{p.cod_producto}</TableCell>
                  <TableCell>{p.descripcion}</TableCell>
                  <TableCell>
                    <Chip label={p.categoria ?? "Sin categoría"} size="small" variant="outlined" />
                  </TableCell>
                </TableRow>
              ))
            )}
          </TableBody>
        </Table>
      </TableContainer>

      {/* Paginación */}
      {totalPages > 1 && (
        <Box sx={{ display: "flex", alignItems: "center", justifyContent: "flex-end", gap: 1, mt: 1 }}>
          <Button size="small" disabled={page <= 1} onClick={() => setSkip((s) => s - take)}>← Ant</Button>
          <Typography variant="body2">{page} / {totalPages}</Typography>
          <Button size="small" disabled={page >= totalPages} onClick={() => setSkip((s) => s + take)}>Sig →</Button>
        </Box>
      )}
    </Box>
  );
}

export function InventarioFisicoTab() {
  const [sesionActiva, setSesionActiva] = useState(null);
  const [tabActivo, setTabActivo] = useState(0);

  return (
    <Box sx={{ display: "flex", flexDirection: { xs: "column", md: "row" }, gap: 2, height: "100%", alignItems: "flex-start" }}>
      <Box sx={{ width: { xs: "100%", md: 320 }, flexShrink: 0, maxHeight: { md: "calc(100vh - 160px)" }, overflowY: "auto", pr: 0.5 }}>
        <Box sx={{ display: "flex", alignItems: "center", gap: 1, mb: 1.5 }}>
          <Inventory2 color="primary" />
          <Typography variant="h6" fontWeight={600}>
            Inventario Físico
          </Typography>
        </Box>
        <SesionesPanel onSeleccionar={(s) => { setSesionActiva(s); setTabActivo(0); }} sesionActiva={sesionActiva} />
        {sesionActiva && (
          <Box sx={{ mt: 2 }}>
            <ProgresoZonas sesion={sesionActiva} />
          </Box>
        )}
      </Box>

      <Divider orientation="vertical" flexItem sx={{ display: { xs: "none", md: "block" } }} />

      <Box sx={{ flex: 1, overflow: "auto", minWidth: 0, width: "100%" }}>
        {sesionActiva ? (
          <>
            <Tabs
              value={tabActivo}
              onChange={(_, v) => setTabActivo(v)}
              sx={{ mb: 2, borderBottom: 1, borderColor: "divider" }}
              variant="scrollable"
            >
              <Tab label="Conteo" icon={<Warehouse fontSize="small" />} iconPosition="start" />
              <Tab
                label="No contados"
                icon={<AssignmentTurnedIn fontSize="small" />}
                iconPosition="start"
                sx={{ color: tabActivo === 1 ? "warning.main" : undefined }}
              />
            </Tabs>
            {tabActivo === 0 && <ConteoPanel sesion={sesionActiva} />}
            {tabActivo === 1 && <FaltantesPanel sesion={sesionActiva} />}
          </>
        ) : (
          <Box
            sx={{
              display: "flex",
              flexDirection: "column",
              alignItems: "center",
              justifyContent: "center",
              height: 300,
              gap: 2,
              color: "text.secondary",
            }}
          >
            <Inventory2 sx={{ fontSize: 64, opacity: 0.3 }} />
            <Typography>Seleccioná una sesión abierta para empezar a contar</Typography>
          </Box>
        )}
      </Box>
    </Box>
  );
}
