import { Injectable } from '@angular/core';
import * as Excel from "exceljs";
import { saveAs } from 'file-saver';
import { MESMREInterface } from 'src/app/interfaces/mes/mesmre/mesmre-interface';

@Injectable({
  providedIn: 'root'
})
export class ExportExcelService {

  constructor() { }

  generarExcel(excelData:any, filename:string, titulo:string) {
    //Saber ultima celda para el filtrado de datos
    let ultimaCelda;

    const title = 'Reporte de periodos vacacionales';
    const header = ['Número de Solicitud', 'Nombre Empleado', 'Fecha Inicio', 'Fecha Fin', 'Número Días', 'Estatus', 'Periodo Vacacional', 'Vacaciones antes', 'Vacaciones después']
    
    const data:MESMREInterface[] = excelData.map((
      solicitud: MESMREInterface
    ) => {
      return {
        IDSOLICITUD: solicitud.IDSOLICITUD,
        NOMBREEMPLEADO: solicitud.NOMBREEMPLEADO,
        FECHAINICIO: solicitud.FECHAINICIO,
        FECHAFIN: solicitud.FECHAFIN,
        NUMERODIAS: solicitud.NUMERODIAS,
        ESTATUS: solicitud.ESTATUS,
        PERIODOVACACIONAL: solicitud.PERIODOVACACIONAL,
        VACACIONESANTES: solicitud.VACACIONESANTES,
        VACACIONESDESPUES: solicitud.VACACIONESDESPUES
      };
    });

    //CREAR LIBRO Y HOJA DE EXCEL
    let workbook = new Excel.Workbook();
    let worksheet = workbook.addWorksheet('Hoja 1');

    //IMAGEN
    const myBase64Image = "data:image/png;base64,[encoded data, 6932 characters]"
    const logo = workbook.addImage({
      base64: myBase64Image,
      extension: 'png',
    });
    worksheet.mergeCells('A1:A6');
    worksheet.addImage(logo, 'A1:A6');

    //TITULO REPORTE
    worksheet.mergeCells('B1', 'G3');
    let titleRow = worksheet.getCell('B1');
    titleRow.value = title
    titleRow.font = {
      name: 'Calibri',
      size: 15,
      bold: true
    }
    titleRow.fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { 
        argb: 'F8F8F8' 
      },
    }
    titleRow.alignment = { horizontal: 'center' }

    //SUBTITULO REPORTE
    worksheet.mergeCells('B4', 'G6');
    let titleRowReport = worksheet.getCell('B5');
    titleRowReport.value = titulo
    titleRowReport.font = {
      name: 'Calibri',
      size: 14,
    }
    titleRowReport.fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { 
        argb: 'F8F8F8' 
      },
    }
    titleRowReport.alignment = { vertical: 'middle', horizontal: 'center' }

    //FECHA TITULO
    worksheet.mergeCells('H1:I3');
    let dateText = worksheet.getCell('H1');
    dateText.value = 'Generado el:';
    dateText.font = {
      name: 'Calibri',
      size: 15,
      bold: true
    }
    dateText.fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { 
        argb: 'F0F0F0' 
      },
    }
    
    dateText.alignment = { horizontal: 'center' }


    //FECHA FORMATO
    let fecha = new Date().toLocaleDateString('es-MX', { year: 'numeric', month: 'long', day: 'numeric' })

    worksheet.mergeCells('H4:I6');
    let dateCell = worksheet.getCell('H4');
    dateCell.value = fecha;
    dateCell.font = {
      name: 'Calibri',
      size: 14,
    }
    dateCell.fill = {
      type: 'pattern',
      pattern: 'solid',
      fgColor: { 
        argb: 'F0F0F0' 
      }
    }
    
    dateCell.alignment = { vertical: 'middle', horizontal: 'center' }

    //FILA EN BLANCO
    worksheet.addRow([]);

    //FILA CON LOS HEADERS
    let headerRow = worksheet.addRow(header);
    headerRow.eachCell((cell, number) => {
      cell.fill = {
        type: 'pattern',
        pattern: 'solid',
        fgColor: { 
          argb: '000000' 
        },
      }
      cell.font = {
        name: 'Calibri',
        size: 12,
        bold: true,
        color: { 
          argb: 'FFFFFF' 
        }
      }
      cell.alignment = { vertical: 'middle', horizontal: 'center' }
    })

    //FILA CON LOS DATOS ENVIADOS DE LA TABLA
    data.forEach(function (solicitud, i) {
      let rowData = worksheet.addRow(Object.values(solicitud));
      rowData.eachCell((cell, number) => {
        cell.alignment = { vertical: 'middle', horizontal: 'center' }
        //Es la ultima fila de nuestro DATA
        if (i+1 == data.length) {
          //Es la ultima celda ?
          //Recuperamos la direccion de la celda para poder aplicar el filtro
          if (rowData.cellCount == number) {
            ultimaCelda = cell.address
          }
        }
      })
    });

    //AJUSTE AUTOMATICO DE WIDTH EN LAS COLUMNAS
    worksheet.columns.forEach(function (column, i) {
      let maxLength = 25;
      let limitWidth = 0;
      if (column["eachCell"] != undefined) {
        column["eachCell"]({ includeEmpty: true }, function (cell) {
          let columnLength = cell.value ? cell.value.toString().length : 0;
          if (columnLength > maxLength ) {
            maxLength = columnLength;
          }
          //Mas grande que el titulo ?
          if (columnLength > 32) {
            limitWidth = 35;
          }
        });
        //Fue mas grande que el titulo ?
        if (limitWidth > 0) {
          column.width = limitWidth
        } else {
          column.width = maxLength > 25 ? 25 : maxLength;
        }
      }
    });

    //A8 esta definido, la ultima celda puede variar
    worksheet.autoFilter = `A8:${ultimaCelda}`;

    //GENERAR Y GUARDAR EL EXCEL
    workbook.xlsx.writeBuffer().then((data) => {
      let blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
      saveAs(blob, filename + '.xlsx');
    })
  }

  formatoFecha(fecha:string): string {
    let split = fecha.split('-');

    return `${split[2]}-${split[1]}-${split[0]}`
  }
}
