import React, { useState, useEffect, useCallback } from 'react';
import {
    Box, Typography, TextField, Button, Paper, IconButton, MenuItem,
    Table, TableBody, TableCell, TableContainer, TableHead, TableRow,
    CircularProgress, Alert, Accordion, AccordionSummary, AccordionDetails, Chip,
    FormControl,
    InputLabel,
    Select
} from '@mui/material';
import AddIcon from '@mui/icons-material/Add';
import DeleteIcon from '@mui/icons-material/Delete';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import FilterListIcon from '@mui/icons-material/FilterList';

import tiradaService from '../../services/Impresion/tiradaService';
import publicacionService from '../../services/Distribucion/publicacionService'; // Para filtro
import plantaService from '../../services/Impresion/plantaService'; // Para filtro

import type { TiradaDto } from '../../models/dtos/Impresion/TiradaDto';
import type { CreateTiradaRequestDto } from '../../models/dtos/Impresion/CreateTiradaRequestDto';
import type { PublicacionDto } from '../../models/dtos/Distribucion/PublicacionDto';
import type { PlantaDto } from '../../models/dtos/Impresion/PlantaDto';

import TiradaFormModal from '../../components/Modals/Impresion/TiradaFormModal';
import { usePermissions } from '../../hooks/usePermissions';
import axios from 'axios';

const GestionarTiradasPage: React.FC = () => {
  const [tiradas, setTiradas] = useState<TiradaDto[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [apiErrorMessage, setApiErrorMessage] = useState<string | null>(null);

  // Filtros
  const [filtroFecha, setFiltroFecha] = useState<string>(new Date().toISOString().split('T')[0]);
  const [filtroIdPublicacion, setFiltroIdPublicacion] = useState<number | string>('');
  const [filtroIdPlanta, setFiltroIdPlanta] = useState<number | string>('');

  const [publicaciones, setPublicaciones] = useState<PublicacionDto[]>([]);
  const [plantas, setPlantas] = useState<PlantaDto[]>([]);
  const [loadingFiltersDropdown, setLoadingFiltersDropdown] = useState(false);

  const [modalOpen, setModalOpen] = useState(false);
  // No hay "editing" para tiradas por ahora, solo crear y borrar.

  const { tienePermiso, isSuperAdmin } = usePermissions();
  const puedeVer = isSuperAdmin || tienePermiso("IT001");
  const puedeRegistrar = isSuperAdmin || tienePermiso("IT002");
  const puedeEliminar = isSuperAdmin || tienePermiso("IT003");

  const fetchFiltersDropdownData = useCallback(async () => {
    setLoadingFiltersDropdown(true);
    try {
        const [pubsData, plantasData] = await Promise.all([
            publicacionService.getAllPublicaciones(undefined, undefined, true),
            plantaService.getAllPlantas()
        ]);
        setPublicaciones(pubsData);
        setPlantas(plantasData);
    } catch (err) {
        console.error("Error cargando datos para filtros:", err);
        setError("Error al cargar opciones de filtro.");
    } finally {
        setLoadingFiltersDropdown(false);
    }
  }, []);

  useEffect(() => {
    fetchFiltersDropdownData();
  }, [fetchFiltersDropdownData]);

  const cargarTiradas = useCallback(async () => {
    if (!puedeVer) {
      setError("No tiene permiso para ver esta sección."); setLoading(false); return;
    }
    setLoading(true); setError(null); setApiErrorMessage(null);
    try {
      const params = {
        fecha: filtroFecha || null,
        idPublicacion: filtroIdPublicacion ? Number(filtroIdPublicacion) : null,
        idPlanta: filtroIdPlanta ? Number(filtroIdPlanta) : null,
      };
      const data = await tiradaService.getTiradas(params);
      setTiradas(data);
    } catch (err) {
      console.error(err); setError('Error al cargar las tiradas.');
    } finally { setLoading(false); }
  }, [puedeVer, filtroFecha, filtroIdPublicacion, filtroIdPlanta]);

  useEffect(() => {
    cargarTiradas();
  }, [cargarTiradas]);

  const handleOpenModal = () => { setApiErrorMessage(null); setModalOpen(true); };
  const handleCloseModal = () => setModalOpen(false);

  const handleSubmitModal = async (data: CreateTiradaRequestDto) => {
    setApiErrorMessage(null);
    try {
      await tiradaService.registrarTirada(data);
      cargarTiradas();
    } catch (err: any) {
      const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al registrar la tirada.';
      setApiErrorMessage(message); throw err;
    }
  };

  const handleDeleteTirada = async (tirada: TiradaDto) => {
    if (window.confirm(`¿Seguro de eliminar la tirada del ${tirada.fecha} para "${tirada.nombrePublicacion}" en planta "${tirada.nombrePlanta}"? Esta acción eliminará el total de ejemplares y todas sus secciones asociadas.`)) {
       setApiErrorMessage(null);
       try {
        await tiradaService.deleteTiradaCompleta(tirada.fecha, tirada.idPublicacion, tirada.idPlanta);
        cargarTiradas();
      } catch (err: any) {
         const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al eliminar la tirada.';
         setApiErrorMessage(message);
      }
    }
  };
  
  const formatDate = (dateString?: string | null) => dateString ? new Date(dateString + 'T00:00:00Z').toLocaleDateString('es-AR') : '-';


  if (!loading && !puedeVer && !loadingFiltersDropdown) return <Box sx={{ p: 2 }}><Alert severity="error">{error || "Acceso denegado."}</Alert></Box>;

  return (
    <Box sx={{ p: 1 }}>
      <Typography variant="h5" gutterBottom>Gestión de Tiradas</Typography>
      <Paper sx={{ p: 2, mb: 2 }}>
        <Typography variant="h6" gutterBottom>Filtros <FilterListIcon fontSize="small"/></Typography>
        <Box sx={{ display: 'flex', flexWrap: 'wrap', gap: 2, alignItems: 'center', mb: 2}}>
            <TextField label="Fecha" type="date" size="small" value={filtroFecha} onChange={(e) => setFiltroFecha(e.target.value)} InputLabelProps={{ shrink: true }} sx={{minWidth: 170}}/>
            <FormControl size="small" sx={{minWidth: 200, flexGrow: 1}} disabled={loadingFiltersDropdown}>
                <InputLabel>Publicación</InputLabel>
                <Select value={filtroIdPublicacion} label="Publicación" onChange={(e) => setFiltroIdPublicacion(e.target.value as number | string)}>
                    <MenuItem value=""><em>Todas</em></MenuItem>
                    {publicaciones.map(p => <MenuItem key={p.idPublicacion} value={p.idPublicacion}>{p.nombre} ({p.nombreEmpresa})</MenuItem>)}
                </Select>
            </FormControl>
            <FormControl size="small" sx={{minWidth: 180, flexGrow: 1}} disabled={loadingFiltersDropdown}>
                <InputLabel>Planta</InputLabel>
                <Select value={filtroIdPlanta} label="Planta" onChange={(e) => setFiltroIdPlanta(e.target.value as number | string)}>
                    <MenuItem value=""><em>Todas</em></MenuItem>
                    {plantas.map(p => <MenuItem key={p.idPlanta} value={p.idPlanta}>{p.nombre}</MenuItem>)}
                </Select>
            </FormControl>
            {/* <Button variant="outlined" onClick={cargarTiradas} size="small">Buscar</Button> */}
        </Box>
         {puedeRegistrar && (<Button variant="contained" startIcon={<AddIcon />} onClick={handleOpenModal}>Registrar Nueva Tirada</Button>)}
      </Paper>

      {loading && <Box sx={{ display: 'flex', justifyContent: 'center', my: 2 }}><CircularProgress /></Box>}
      {error && !loading && <Alert severity="error" sx={{my: 2}}>{error}</Alert>}
      {apiErrorMessage && <Alert severity="error" sx={{my: 2}}>{apiErrorMessage}</Alert>}

      {!loading && !error && puedeVer && (
         <Box>
            {tiradas.length === 0 ? (
                <Typography sx={{mt:2, textAlign:'center'}}>No se encontraron tiradas con los filtros aplicados.</Typography>
            ) : (
                tiradas.map((tirada) => (
                    <Accordion key={tirada.idRegistroTirada} sx={{mb:1}}>
                        <AccordionSummary expandIcon={<ExpandMoreIcon />}>
                            <Box sx={{display: 'flex', justifyContent: 'space-between', width: '100%', alignItems: 'center'}}>
                                <Typography sx={{fontWeight:'bold'}}>{formatDate(tirada.fecha)} - {tirada.nombrePublicacion} ({tirada.nombrePlanta})</Typography>
                                <Box>
                                    <Chip label={`${tirada.ejemplares} ej.`} color="primary" size="small" sx={{mr:1}}/>
                                    <Chip label={`${tirada.totalPaginasSumadas} pág.`} size="small" />
                                    {puedeEliminar && (
                                        <IconButton size="small" onClick={(e) => { e.stopPropagation(); handleDeleteTirada(tirada);}} sx={{ml:1}}>
                                            <DeleteIcon color="error"/>
                                        </IconButton>
                                    )}
                                </Box>
                            </Box>
                        </AccordionSummary>
                        <AccordionDetails>
                            <TableContainer component={Paper} variant="outlined">
                                <Table size="small">
                                    <TableHead><TableRow>
                                        <TableCell><strong>Sección</strong></TableCell>
                                        <TableCell align="right"><strong>Páginas</strong></TableCell>
                                    </TableRow></TableHead>
                                    <TableBody>
                                        {tirada.seccionesImpresas.map(sec => (
                                            <TableRow key={sec.idRegPublicacionSeccion}>
                                                <TableCell>{sec.nombreSeccion}</TableCell>
                                                <TableCell align="right">{sec.cantPag}</TableCell>
                                            </TableRow>
                                        ))}
                                    </TableBody>
                                </Table>
                            </TableContainer>
                        </AccordionDetails>
                    </Accordion>
                ))
            )}
         </Box>
       )}
        {/* No hay paginación para la lista de Acordeones por ahora */}

      <TiradaFormModal
        open={modalOpen}
        onClose={handleCloseModal}
        onSubmit={handleSubmitModal}
        errorMessage={apiErrorMessage}
        clearErrorMessage={() => setApiErrorMessage(null)}
      />
    </Box>
  );
};

export default GestionarTiradasPage;