import { Cloud, CloudOff, Save } from "@mui/icons-material";
import {
  Alert,
  Box,
  Button,
  Chip,
  FormControlLabel,
  Paper,
  Stack,
  Switch,
  Typography,
} from "@mui/material";
import { useMutation, useQueryClient } from "@tanstack/react-query";
import { useEffect, useState } from "react";
import { toast } from "sonner";
import { updateEmpresa } from "../../../api/empresas.service";
import { useEmpresa } from "../../../context/EmpresaContext";
import { useAuthStore } from "../../../store/AuthStore";

/**
 * Switch para empresas que todavía no operan con factura electrónica SIFEN.
 * Cuando está OFF, los documentos (FC, NC) se aprueban localmente sin enviarse
 * al middleware, y los eventos de cancelación se aplican como reverso directo
 * (sin transmitir a SIFEN). Sólo editable por superadmin.
 */
export const FacturacionElectronicaConfig = () => {
  const { empresa, empresaId, refetch } = useEmpresa();
  const { isSuperAdmin, user, setEmpresa } = useAuthStore();
  const queryClient = useQueryClient();
  const [activo, setActivo] = useState(true);

  useEffect(() => {
    if (empresa) setActivo(empresa.sifen_activo !== false);
  }, [empresa]);

  const mutation = useMutation({
    mutationFn: (sifen_activo) => updateEmpresa(empresaId, { sifen_activo }),
    onSuccess: (_, sifen_activo) => {
      toast.success(
        sifen_activo
          ? "Facturación electrónica activada — los documentos se enviarán a SIFEN."
          : "Modo manual activado — los documentos se aprobarán localmente sin SIFEN.",
      );
      queryClient.invalidateQueries({ queryKey: ["empresa"] });
      refetch();
      // Refrescar el flag en el store para que las UIs reactivas se enteren al toque.
      if (user?.empresa?.id === empresaId) {
        setEmpresa({ ...user.empresa, sifen_activo });
      }
    },
    onError: (err) => {
      toast.error(err?.response?.data?.message || "No se pudo actualizar la configuración");
      // Restaurar el valor previo
      setActivo(empresa?.sifen_activo !== false);
    },
  });

  const cambio = activo !== (empresa?.sifen_activo !== false);

  if (!isSuperAdmin) {
    return null; // Sólo superadmin ve esta sección
  }

  return (
    <Paper sx={{ p: 3 }} elevation={0} variant="outlined">
      <Stack direction="row" alignItems="center" spacing={1} sx={{ mb: 1 }}>
        {activo ? (
          <Cloud sx={{ color: "success.main" }} />
        ) : (
          <CloudOff sx={{ color: "warning.main" }} />
        )}
        <Typography variant="h6" fontWeight={700}>
          Facturación Electrónica (SIFEN)
        </Typography>
        <Chip
          size="small"
          label={activo ? "Activa" : "Modo manual"}
          color={activo ? "success" : "warning"}
          sx={{ ml: 1 }}
        />
      </Stack>

      <Typography variant="body2" color="text.secondary" sx={{ mb: 2 }}>
        Cuando la facturación electrónica está activa, las facturas y notas de crédito se envían
        al middleware SIFEN para obtener el CDC, QR y aprobación oficial. Si todavía no tenés
        certificado digital ni timbrado electrónico, podés operar en{" "}
        <b>modo manual</b>: los documentos se marcan como aprobados localmente y la
        cancelación se aplica como reverso directo, sin transmitir nada a SIFEN.
      </Typography>

      <FormControlLabel
        control={
          <Switch
            checked={activo}
            onChange={(e) => setActivo(e.target.checked)}
            color="primary"
          />
        }
        label={
          <Box>
            <Typography variant="body1" fontWeight={600}>
              {activo ? "Facturación electrónica activada" : "Modo manual (sin SIFEN)"}
            </Typography>
            <Typography variant="caption" color="text.secondary">
              {activo
                ? "Los documentos se envían a SIFEN y obtienen CDC + QR oficial."
                : "Los documentos se aprueban localmente. No hay CDC, QR ni eventos enviados a SIFEN."}
            </Typography>
          </Box>
        }
      />

      {!activo && (
        <Alert severity="info" sx={{ mt: 2 }}>
          <Typography variant="body2">
            <b>En modo manual:</b>
          </Typography>
          <Typography component="div" variant="caption" color="text.secondary">
            <ul style={{ margin: "4px 0", paddingLeft: 18 }}>
              <li>Cada FC y NC queda aprobada de forma manual, sin CDC ni firma SIFEN.</li>
              <li>La cancelación marca el documento como Cancelado y aplica los reversos de stock/contabilidad/caja localmente.</li>
              <li>No se admite inutilización ni nominación (eventos SIFEN puros).</li>
              <li>El KuDE/PDF se imprime sin QR ni CDC.</li>
            </ul>
          </Typography>
        </Alert>
      )}

      {cambio && (
        <Box sx={{ mt: 2, display: "flex", justifyContent: "flex-end" }}>
          <Button
            variant="contained"
            startIcon={<Save />}
            disabled={mutation.isPending}
            onClick={() => mutation.mutate(activo)}
          >
            {mutation.isPending ? "Guardando…" : "Guardar cambio"}
          </Button>
        </Box>
      )}
    </Paper>
  );
};
