import React, { useState, useEffect, useCallback } from 'react';
import {
    Box, Typography, TextField, Button, Paper, IconButton, Menu, MenuItem,
    Table, TableBody, TableCell, TableContainer, TableHead, TableRow, TablePagination,
    CircularProgress, Alert
} from '@mui/material';
import AddIcon from '@mui/icons-material/Add';
import MoreVertIcon from '@mui/icons-material/MoreVert';
import EditIcon from '@mui/icons-material/Edit';
import DeleteIcon from '@mui/icons-material/Delete';
import FilterListIcon from '@mui/icons-material/FilterList';

import ritmoService from '../../services/Radios/ritmoService';
import type { RitmoDto } from '../../models/dtos/Radios/RitmoDto';
import type { CreateRitmoDto } from '../../models/dtos/Radios/CreateRitmoDto';
import type { UpdateRitmoDto } from '../../models/dtos/Radios/UpdateRitmoDto';
import RitmoFormModal from '../../components/Modals/Radios/RitmoFormModal';
import { usePermissions } from '../../hooks/usePermissions';
import axios from 'axios';

const GestionarRitmosPage: React.FC = () => {
  const [ritmos, setRitmos] = useState<RitmoDto[]>([]);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);
  const [apiErrorMessage, setApiErrorMessage] = useState<string | null>(null);

  const [filtroNombre, setFiltroNombre] = useState('');

  const [modalOpen, setModalOpen] = useState(false);
  const [editingRitmo, setEditingRitmo] = useState<RitmoDto | null>(null);

  const [page, setPage] = useState(0);
  const [rowsPerPage, setRowsPerPage] = useState(10);
  const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
  const [selectedRow, setSelectedRow] = useState<RitmoDto | null>(null);

  const { tienePermiso, isSuperAdmin } = usePermissions();
  // Usar el permiso general de la sección Radios (SS005) o crear permisos específicos si es necesario.
  const puedeGestionar = isSuperAdmin || tienePermiso("SS005");


  const cargarRitmos = useCallback(async () => {
    if (!puedeGestionar) { // Asumimos que el mismo permiso es para ver y gestionar
      setError("No tiene permiso para acceder a esta sección.");
      setLoading(false);
      return;
    }
    setLoading(true); setError(null); setApiErrorMessage(null);
    try {
      const data = await ritmoService.getAllRitmos(filtroNombre);
      setRitmos(data);
    } catch (err) {
      console.error(err); setError('Error al cargar los ritmos.');
    } finally { setLoading(false); }
  }, [puedeGestionar, filtroNombre]);

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

  const handleOpenModal = (item?: RitmoDto) => {
    setEditingRitmo(item || null); setApiErrorMessage(null); setModalOpen(true);
  };
  const handleCloseModal = () => {
    setModalOpen(false); setEditingRitmo(null);
  };

  const handleSubmitModal = async (data: CreateRitmoDto | UpdateRitmoDto, id?: number) => {
    setApiErrorMessage(null);
    try {
      if (id && editingRitmo) {
        await ritmoService.updateRitmo(id, data as UpdateRitmoDto);
      } else {
        await ritmoService.createRitmo(data as CreateRitmoDto);
      }
      cargarRitmos();
    } catch (err: any) {
      const message = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al guardar el ritmo.';
      setApiErrorMessage(message); throw err;
    }
  };

  const handleDelete = async (id: number) => {
    if (window.confirm(`¿Seguro de eliminar este ritmo (ID: ${id})?`)) {
       setApiErrorMessage(null);
       try { await ritmoService.deleteRitmo(id); cargarRitmos(); }
       catch (err: any) { const msg = axios.isAxiosError(err) && err.response?.data?.message ? err.response.data.message : 'Error al eliminar.'; setApiErrorMessage(msg); }
    }
    handleMenuClose();
  };

  const handleMenuOpen = (event: React.MouseEvent<HTMLElement>, item: RitmoDto) => {
    setAnchorEl(event.currentTarget); setSelectedRow(item);
  };
  const handleMenuClose = () => { setAnchorEl(null); setSelectedRow(null); };

  const handleChangePage = (_event: unknown, newPage: number) => setPage(newPage);
  const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement>) => {
    setRowsPerPage(parseInt(event.target.value, 10)); setPage(0);
  };
  const displayData = ritmos.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage);

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

  return (
    <Box sx={{ p: 1 }}>
      <Typography variant="h5" gutterBottom>Gestionar Ritmos</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="Filtrar por Nombre" size="small" value={filtroNombre} onChange={(e) => setFiltroNombre(e.target.value)} sx={{minWidth: 200, flexGrow: 1}}/>
            {/* <Button variant="outlined" onClick={cargarRitmos} size="small">Buscar</Button> */}
         </Box>
         {puedeGestionar && (<Button variant="contained" startIcon={<AddIcon />} onClick={() => handleOpenModal()}>Agregar Ritmo</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 && puedeGestionar && (
         <TableContainer component={Paper}>
           <Table size="small">
             <TableHead><TableRow>
                 <TableCell sx={{fontWeight: 'bold'}}>Nombre del Ritmo</TableCell>
                 <TableCell align="right" sx={{fontWeight: 'bold'}}>Acciones</TableCell>
             </TableRow></TableHead>
             <TableBody>
               {displayData.length === 0 ? (
                  <TableRow><TableCell colSpan={2} align="center">No se encontraron ritmos.</TableCell></TableRow>
               ) : (
                 displayData.map((r) => (
                     <TableRow key={r.id} hover>
                     <TableCell>{r.nombreRitmo || '-'}</TableCell>
                     <TableCell align="right">
                        <IconButton onClick={(e) => handleMenuOpen(e, r)} disabled={!puedeGestionar}><MoreVertIcon /></IconButton>
                     </TableCell>
                     </TableRow>
                 )))}
             </TableBody>
           </Table>
           <TablePagination
             rowsPerPageOptions={[10, 25, 50]} component="div" count={ritmos.length}
             rowsPerPage={rowsPerPage} page={page} onPageChange={handleChangePage}
             onRowsPerPageChange={handleChangeRowsPerPage} labelRowsPerPage="Filas por página:"
           />
         </TableContainer>
       )}

      <Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleMenuClose}>
        {puedeGestionar && selectedRow && (
            <MenuItem onClick={() => { handleOpenModal(selectedRow); handleMenuClose(); }}><EditIcon fontSize="small" sx={{mr:1}}/> Modificar</MenuItem>)}
        {puedeGestionar && selectedRow && (
            <MenuItem onClick={() => handleDelete(selectedRow.id)}><DeleteIcon fontSize="small" sx={{mr:1}}/> Eliminar</MenuItem>)}
      </Menu>

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

export default GestionarRitmosPage;