import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { TableModule, Table } from 'primeng/table';
import { InputTextModule } from 'primeng/inputtext';
import { SelectModule } from 'primeng/select';
import { TooltipModule } from 'primeng/tooltip';
import { ButtonModule } from 'primeng/button';
import * as FileSaver from 'file-saver';
import { Workbook } from 'exceljs';

@Component({
  selector: 'app-ajuste-pd',
  imports: [
    FormsModule,
    TableModule,
    InputTextModule,
    SelectModule,
    TooltipModule,
    ButtonModule
  ],
  templateUrl: './ajuste-pd.component.html',
  styleUrl: './ajuste-pd.component.scss'
})
export class AjustePdComponent {
  selectedCity: any = '';
  empresas: any[] = [{ name: 'Empresa A' }, { name: 'Empresa B' }, { name: 'Empresa C' }];
  select1: any = '';
  estadoAprobacion = [
    { name: 'Aprobado', value: true },
    { name: 'Rechazado', value: false },
  ];
  products: any[] = [
    {
      empresa: 'Empresa A',
      codigoCronograma: '123',
      codigoCronogramaAjuste: '456',
      tipoCarga: 'Inicial',
      estadoRevision: 'Ingresado',
      analista: 'No asignado',
      fechaIngreso: '2025-04-29',
      semaforo: 'green',
      dato9: 'Ingresado',
      dato10: 'No asignado',
      dato15: 'green',
      dato16: 'green',
      dato17: 'green',
      dato18: 'green',
      dato13: 'Rechazado',
      dato14: 'green',
    },
    {
      empresa: 'Empresa A',
      codigoCronograma: '123',
      codigoCronogramaAjuste: '456',
      tipoCarga: 'Inicial',
      estadoRevision: 'En revisión',
      analista: 'Gabriel Torres',
      fechaIngreso: '2025-04-29',
      semaforo: 'yellow',
      dato9: 'Ingresado',
      dato10: 'No asignado',
      dato15: 'green',
      dato16: 'green',
      dato17: 'green',
      dato18: 'green',
      dato13: 'Rechazado',
      dato14: 'green',
    },
    {
      empresa: 'Empresa A',
      codigoCronograma: '123',
      codigoCronogramaAjuste: '456',
      tipoCarga: 'Inicial',
      estadoRevision: 'Rechazado',
      analista: 'Jorge Muñoz',
      fechaIngreso: '2025-04-29',
      semaforo: 'red',
      dato9: 'Ingresado',
      dato10: 'No asignado',
      dato15: 'green',
      dato16: 'green',
      dato17: 'green',
      dato18: 'green',
      dato13: 'Rechazado',
      dato14: 'green',
    },
    {
      empresa: 'Empresa A',
      codigoCronograma: '123',
      codigoCronogramaAjuste: '456',
      tipoCarga: 'Inicial',
      estadoRevision: 'Aprobado',
      analista: 'Jarolt Matamoros',
      fechaIngreso: '2025-04-29',
      semaforo: 'green',
      dato9: 'Ingresado',
      dato10: 'No asignado',
      dato15: 'green',
      dato16: 'green',
      dato17: 'green',
      dato18: 'green',
      dato13: 'Rechazado',
      dato14: 'green',
    },
  ];
  
  /**
   * Exporta los datos de la tabla a Excel con estilos en los encabezados
   * @param table Tabla PrimeNG a exportar
   */
  exportExcelWithStyles(table: Table): void {
    // Creamos un nuevo libro de trabajo
    const workbook = new Workbook();
    const worksheet = workbook.addWorksheet('Datos');

    // Obtenemos los datos
    const data = table.filteredValue || table.value;

    // Añadimos la fila de encabezados agrupados
    this.addGroupedHeaders(worksheet);

    // Añadimos la fila de encabezados detallados
    const headers = this.getHeaders();
    worksheet.addRow(headers);

    // Añadimos los datos a la hoja
    this.populateWorksheet(worksheet, data);

    // Aplicamos estilos a los encabezados
    this.styleHeaders(worksheet);

    // Configuramos propiedades generales de la hoja
    this.configureWorksheet(worksheet, data.length);

    // Exportamos el archivo
    this.saveExcelFile(workbook);
  }

  /**
   * Añade la fila de encabezados agrupados
   */
  private addGroupedHeaders(worksheet: any): void {
    // Añadir fila de encabezados agrupados
    const groupHeaderRow = worksheet.addRow([
      '', '', '', '', '', '', '', '', '',
      'Cronograma base vigente', '', '',
      'Cronograma base ajustado', '', '', '',
      '', '', ''
    ]);

    // Combinar celdas para los grupos de encabezados
    worksheet.mergeCells(1, 10, 1, 12); // Cronograma base vigente (columnas 10-12)
    worksheet.mergeCells(1, 13, 1, 16); // Cronograma base ajustado (columnas 13-16)

    // Dar formato a las celdas combinadas
    groupHeaderRow.getCell(10).fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { argb: '0066CC' } // Color azul oscuro para "Cronograma base vigente"
    };
    groupHeaderRow.getCell(13).fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { argb: '0000CC' } // Color azul más fuerte para "Cronograma base ajustado"
    };

    // Estilo de texto para encabezados agrupados
    [10, 13].forEach(cellIndex => {
      const cell = groupHeaderRow.getCell(cellIndex);
      cell.font = {
        name: 'Arial',
        size: 12,
        bold: true,
        color: { argb: 'FFFFFF' } // Texto blanco
      };
      cell.alignment = {
        horizontal: 'center',
        vertical: 'middle'
      };
    });
  }

  /**
   * Devuelve los cabeceros para el archivo Excel
   */
  private getHeaders(): string[] {
    return [
      'Empresa',
      'Código de cronograma',
      'Etapa del Servicio',
      'Nombre sistema',
      'Nombre localidad',
      'Tipo de inversión',
      'Código de glosa PD',
      'Descripción glosa',
      'Monto Inversión Total (UF)',
      'Año de Inicio',
      'Año de Término',
      'Mes de Término',
      'Tipo de ajuste',
      'Año de Inicio',
      'Año de Término',
      'Mes de Término',
      'Nota',
      'Estado aprobación',
      'Observación'
    ];
  }

  /**
   * Rellena la hoja con los datos de la tabla
   */
  private populateWorksheet(worksheet: any, data: any[]): void {
    // Añadimos los datos
    data.forEach(item => {
      // Determinar estado de aprobación basado en el valor
      let estadoAprobacion;
      if (typeof item.dato13 === 'boolean') {
        estadoAprobacion = item.dato13 ? 'Aprobado' : 'Rechazado';
      } else {
        estadoAprobacion = item.dato13;
      }
      
      worksheet.addRow([
        item.empresa,                    // Empresa
        item.codigoCronograma,           // Código de cronograma
        item.codigoCronogramaAjuste,     // Etapa del Servicio
        item.tipoCarga,                  // Nombre sistema
        item.estadoRevision,             // Nombre localidad
        item.fechaIngreso,               // Tipo de inversión
        item.estadoRevision,             // Código de glosa PD
        item.dato9,                      // Descripción glosa
        item.dato10,                     // Monto Inversión Total (UF)
        item.dato13,                     // Año de Inicio (Cronograma base vigente)
        item.dato14,                     // Año de Término (Cronograma base vigente)
        item.dato15,                     // Mes de Término (Cronograma base vigente)
        item.dato16,                     // Tipo de ajuste (Cronograma base ajustado)
        item.dato17,                     // Año de Inicio (Cronograma base ajustado)
        item.dato18,                     // Año de Término (Cronograma base ajustado)
        item.dato11,                     // Mes de Término (Cronograma base ajustado)
        item.dato12,                     // Nota
        estadoAprobacion,                // Estado aprobación
        item.analista                    // Observación
      ]);
    });
  }

  /**
   * Aplica estilos a los encabezados
   */
  private styleHeaders(worksheet: any): void {
    // Estilo para la segunda fila (encabezados detallados)
    const detailedHeaderRow = worksheet.getRow(2);
    detailedHeaderRow.height = 25;

    detailedHeaderRow.eachCell(cell => {
      // Estilo de texto Encabezado
      cell.font = {
        name: 'Arial',
        size: 12,
        bold: true,
        color: { argb: 'FFFFFF' } // Texto blanco
      };

      // Bordes
      cell.border = {
        top: { style: 'thin' },
        left: { style: 'thin' },
        bottom: { style: 'thin' },
        right: { style: 'thin' }
      };

      // Alineación
      cell.alignment = {
        horizontal: 'center',
        vertical: 'middle'
      };

      // Color de fondo para encabezados normales
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: { argb: '0066CC' } // Color azul por defecto
      };
    });

    // Aplicar colores específicos según el grupo de encabezados
    // Cronograma base ajustado (columnas 13-16)
    for (let i = 13; i <= 16; i++) {
      const cell = detailedHeaderRow.getCell(i);
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: { argb: '0000CC' } // Azul más fuerte
      };
    }

    // Estado aprobación y Observación (columnas 18-19)
    for (let i = 18; i <= 19; i++) {
      const cell = detailedHeaderRow.getCell(i);
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: { argb: '28a745' } // Color verde
      };
    }
  }

  /**
   * Configura propiedades generales de la hoja de trabajo
   */
  private configureWorksheet(worksheet: any, dataLength: number): void {
    // Configuramos altura de fila predeterminada
    worksheet.properties.defaultRowHeight = 20;

    // Ajustamos el ancho de las columnas automáticamente
    this.adjustColumnWidths(worksheet);

    // Congelamos la primera fila
    worksheet.views = [{ state: 'frozen', xSplit: 0, ySplit: 2 }]; // Congelamos 2 filas
  }

  /**
   * Ajusta el ancho de las columnas según el contenido
   */
  private adjustColumnWidths(worksheet: any): void {
    if (worksheet.columns) {
      worksheet.columns.forEach(column => {
        if (column) {
          let maxLength = 0;
          column.eachCell({ includeEmpty: true }, cell => {
            const columnLength = cell.value ? cell.value.toString().length : 10;
            if (columnLength > maxLength) {
              maxLength = columnLength;
            }
          });
          column.width = maxLength < 10 ? 10 : maxLength + 2;
        }
      });
    } else {
      // Si no hay columnas definidas, establecemos valores predeterminados
      const columnWidths = [
        { width: 15 }, // Empresa
        { width: 20 }, // Código de cronograma
        { width: 18 }, // Etapa del Servicio
        { width: 18 }, // Nombre sistema
        { width: 18 }, // Nombre localidad
        { width: 18 }, // Tipo de inversión
        { width: 18 }, // Código de glosa PD
        { width: 22 }, // Descripción glosa
        { width: 18 }, // Monto Inversión Total (UF)
        { width: 15 }, // Año de Inicio (vigente)
        { width: 15 }, // Año de Término (vigente)
        { width: 15 }, // Mes de Término (vigente)
        { width: 15 }, // Tipo de ajuste
        { width: 15 }, // Año de Inicio (ajustado)
        { width: 15 }, // Año de Término (ajustado)
        { width: 15 }, // Mes de Término (ajustado)
        { width: 15 }, // Nota
        { width: 18 }, // Estado aprobación
        { width: 20 }  // Observación
      ];
      worksheet.columns = columnWidths;
    }
  }

  /**
   * Guarda el archivo Excel generado
   */
  private saveExcelFile(workbook: any): void {
    const today = new Date();
    const fileName = `Cronograma_temporal_por_ajuste_de_PD${today.getFullYear()}${(today.getMonth() + 1).toString().padStart(2, '0')}${today.getDate().toString().padStart(2, '0')}.xlsx`;

    workbook.xlsx.writeBuffer()
      .then(buffer => {
        const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
        FileSaver.saveAs(blob, fileName);
      })
      .catch(error => console.error('Error al exportar a Excel:', error));
  }
}