// src/components/BancasManager.tsx
import { useState } from 'react';
import { useQuery, useQueryClient } from '@tanstack/react-query';
import { getBancadas, getAgrupaciones, updateBancada, type UpdateBancadaData } from '../services/apiService';
import type { Bancada, AgrupacionPolitica } from '../types';
import { OcupantesModal } from './OcupantesModal';
import './AgrupacionesManager.css';

const camaras = ['diputados', 'senadores'] as const;

export const BancasManager = () => {
  const [activeTab, setActiveTab] = useState<'diputados' | 'senadores'>('diputados');
  const [modalVisible, setModalVisible] = useState(false);
  const [bancadaSeleccionada, setBancadaSeleccionada] = useState<Bancada | null>(null);
  const queryClient = useQueryClient();

  const { data: agrupaciones = [] } = useQuery<AgrupacionPolitica[]>({
    queryKey: ['agrupaciones'],
    queryFn: getAgrupaciones
  });

  const { data: bancadas = [], isLoading, error } = useQuery<Bancada[]>({
    queryKey: ['bancadas', activeTab],
    queryFn: () => getBancadas(activeTab),
  });

  const handleAgrupacionChange = async (bancadaId: number, nuevaAgrupacionId: string | null) => {
    const bancadaActual = bancadas.find(b => b.id === bancadaId);
    if (!bancadaActual) return;

    // Si se desasigna el partido (vacante), también se limpia el ocupante
    const payload: UpdateBancadaData = {
      agrupacionPoliticaId: nuevaAgrupacionId,
      nombreOcupante: nuevaAgrupacionId ? (bancadaActual.ocupante?.nombreOcupante ?? null) : null,
      fotoUrl: nuevaAgrupacionId ? (bancadaActual.ocupante?.fotoUrl ?? null) : null,
      periodo: nuevaAgrupacionId ? (bancadaActual.ocupante?.periodo ?? null) : null,
    };

    try {
      await updateBancada(bancadaId, payload);
      queryClient.invalidateQueries({ queryKey: ['bancadas', activeTab] });
    } catch (err) {
      alert("Error al guardar el cambio de agrupación.");
    }
  };

  const handleOpenModal = (bancada: Bancada) => {
    setBancadaSeleccionada(bancada);
    setModalVisible(true);
  };

  if (error) return <p style={{ color: 'red' }}>Error al cargar las bancas.</p>;

  return (
    <div className="admin-module">
      <h2>Gestión de Ocupación de Bancas</h2>
      <p>Asigne a cada banca física un partido político y, opcionalmente, los datos de la persona que la ocupa.</p>

      <div className="chamber-tabs">
        {camaras.map(camara => (
          <button
            key={camara}
            className={activeTab === camara ? 'active' : ''}
            onClick={() => setActiveTab(camara)}
          >
            {camara === 'diputados' ? 'Cámara de Diputados' : 'Cámara de Senadores'}
          </button>
        ))}
      </div>

      {isLoading ? <p>Cargando bancas...</p> : (
        <table>
          <thead>
            <tr>
              <th style={{ width: '15%' }}>Banca #</th>
              <th style={{ width: '35%' }}>Partido Asignado</th>
              <th style={{ width: '30%' }}>Ocupante Actual</th>
              <th style={{ width: '20%' }}>Acciones</th>
            </tr>
          </thead>
          <tbody>
            {bancadas.map((bancada) => (
              <tr key={bancada.id}>
                {/* Usamos el NumeroBanca para la etiqueta visual */}
                <td>
                  {`${activeTab.charAt(0).toUpperCase()}-${bancada.numeroBanca}`}
                  {((activeTab === 'diputados' && bancada.numeroBanca === 92) ||
                    (activeTab === 'senadores' && bancada.numeroBanca === 46)) && (
                      <span style={{ marginLeft: '8px', fontSize: '0.8em', color: '#666', fontStyle: 'italic' }}>
                        (Presidencia)
                      </span>
                    )}
                </td>
                <td>
                  <select
                    value={bancada.agrupacionPoliticaId || ''}
                    onChange={(e) => handleAgrupacionChange(bancada.id, e.target.value || null)}
                  >
                    <option value="">-- Vacante --</option>
                    {agrupaciones.map(a => <option key={a.id} value={a.id}>{a.nombre}</option>)}
                  </select>
                </td>
                <td>{bancada.ocupante?.nombreOcupante || 'Sin asignar'}</td>
                <td>
                  <button
                    // El botón se habilita solo si hay un partido asignado a la banca
                    disabled={!bancada.agrupacionPoliticaId}
                    onClick={() => handleOpenModal(bancada)}
                  >
                    Editar Ocupante
                  </button>
                </td>
              </tr>
            ))}
          </tbody>
        </table>
      )}

      {modalVisible && bancadaSeleccionada && (
        <OcupantesModal
          bancada={bancadaSeleccionada}
          onClose={() => setModalVisible(false)}
          activeTab={activeTab}
        />
      )}
    </div>
  );
};