import { useState } from 'react';
import { calendarYmdFromServer } from '../../../../../utils/serverCalendarDate';

/**
 * Hook personalizado para manejar el estado de edición de filas de CUPS
 * Incluye soporte para propagación de datos comunes
 */
export const useContratoEdition = () => {
  const [editingRows, setEditingRows] = useState<Set<string>>(new Set());
  const [editedData, setEditedData] = useState<{ [key: string]: any }>({});

  const startEdit = (rowId: string, currentData: any) => {
    setEditingRows(prev => {
      const newSet = new Set(prev);
      newSet.add(rowId);
      return newSet;
    });

    setEditedData(prev => ({
      ...prev,
      [rowId]: {
        FecActCUPs: currentData.FecActCUPs ? calendarYmdFromServer(currentData.FecActCUPs) : '',
        FecVenCUPs: currentData.FecVenCUPs ? calendarYmdFromServer(currentData.FecVenCUPs) : '',
        EstConCups: currentData.EstConCups || 1,
        comercializadora: currentData.comercializadora?.CodCom || currentData.comercializadora || '',
        producto: currentData.producto?.CodPro || currentData.producto || '',
        anexo: currentData.anexo_producto?.CodAnePro || currentData.anexo || '',
        Id_Tarifa_Automatica: currentData.Id_Tarifa_Automatica || '',
        nombretarifa: currentData.nombretarifa || '',
        productCode: currentData.productCode || '',
        version: currentData.version || '',
        GDO: (currentData.GDO === 1 || currentData.GDO === '1' || currentData.GDO === true) ? '1' : '0',
        Permanencia: (currentData.Permanencia === 1 || currentData.Permanencia === '1' || currentData.Permanencia === true) ? '1' : '0',
        CambioTitular: (currentData.CambioTitular === 1 || currentData.CambioTitular === '1' || currentData.CambioTitular === true) ? '1' : '0',
        CambioPotencia: (currentData.CambioPotencia === 1 || currentData.CambioPotencia === '1' || currentData.CambioPotencia === true) ? '1' : '0',
      }
    }));
  };

  const cancelEdit = (rowId: string) => {
    setEditingRows(prev => {
      const newSet = new Set(prev);
      newSet.delete(rowId);
      return newSet;
    });

    setEditedData(prev => {
      const newData = { ...prev };
      delete newData[rowId];
      return newData;
    });
  };

  /**
   * Actualiza un campo y opcionalmente propaga el cambio a todas las filas si isDatosComunes es true
   * @param rowId ID de la fila que se está editando
   * @param field Campo a actualizar
   * @param value Valor del campo
   * @param isDatosComunes Si es true, propaga el cambio a todas las filas en edición
   * @param allRowIds Array opcional de todos los IDs de filas para propagar cambios
   */
  const updateField = (
    rowId: string,
    field: string,
    value: any,
    isDatosComunes?: boolean,
    allRowIds?: string[]
  ) => {
    // Campos que se pueden compartir entre CUPS
    const camposComunes = ['comercializadora', 'producto', 'anexo', 'FecActCUPs', 'FecVenCUPs', 'Id_Tarifa_Automatica', 'nombretarifa', 'productCode', 'version', 'GDO', 'Permanencia'];

    if (isDatosComunes && camposComunes.includes(field) && allRowIds && allRowIds.length > 0) {
      // Propagar el cambio a todas las filas
      setEditedData(prev => {
        const newData = { ...prev };
        allRowIds.forEach(id => {
          if (newData[id]) {
            newData[id] = {
              ...newData[id],
              [field]: value,
              // Si se cambia comercializadora, resetear producto y anexo
              ...(field === 'comercializadora' ? { producto: '', anexo: '', Id_Tarifa_Automatica: '', nombretarifa: '', productCode: '', version: '' } : {}),
              // Si se cambia producto, resetear anexo
              ...(field === 'producto' ? { anexo: '' } : {})
            };
          }
        });
        return newData;
      });
    } else {
      // Actualizar solo la fila actual
      setEditedData(prev => ({
        ...prev,
        [rowId]: {
          ...prev[rowId],
          [field]: value,
          // Si se cambia comercializadora, resetear producto y anexo
          ...(field === 'comercializadora' ? { producto: '', anexo: '', Id_Tarifa_Automatica: '', nombretarifa: '', productCode: '', version: '' } : {}),
          // Si se cambia producto, resetear anexo
          ...(field === 'producto' ? { anexo: '' } : {})
        }
      }));
    }
  };

  const clearEdit = (rowId: string) => {
    setEditingRows(prev => {
      const newSet = new Set(prev);
      newSet.delete(rowId);
      return newSet;
    });

    setEditedData(prev => {
      const newData = { ...prev };
      delete newData[rowId];
      return newData;
    });
  };

  const isEditing = (rowId: string) => editingRows.has(rowId);

  const getEditData = (rowId: string) => editedData[rowId] || {};

  return {
    editingRows,
    editedData,
    startEdit,
    cancelEdit,
    updateField,
    clearEdit,
    isEditing,
    getEditData
  };
};

