import { Component, AfterViewInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatTableDataSource } from '@angular/material/table';
import { Router } from '@angular/router';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';

import { AlertaComponent } from '../../resources/dialogos/alerta/alerta.component';
import { IAMService } from 'src/app/services/iam/iam.service';

import { MCOMDFService } from 'src/app/services/mco/mcomdf/mcomdf.service';
import { MCOMDFFORMComponent } from './mcomdf-form/mcomdf-form.component';
import { ENCService } from 'src/app/services/enc/enc.service';
import { USERInterface } from 'src/app/interfaces/user-interface';

@Component({
  selector: 'app-mcomdf',
  templateUrl: './mcomdf.component.html',
  styleUrls: ['./mcomdf.component.css'],
})
export class MCOMDFComponent implements AfterViewInit {

  usuario_session:USERInterface = JSON.parse(localStorage.getItem('TIMUSERENC')!);
  loading: Boolean = true;
  data_empty = false;
  displayedColumns: string[] = ['periodo', 'mes', 'dia', 'motivo', 'accion'];
  dataSource = new MatTableDataSource<any>([]);

  nombreMeses: any[] = [
    'Enero',
    'Febrero',
    'Marzo',
    'Abril',
    'Mayo',
    'Junio',
    'Julio',
    'Agosto',
    'Septiembre',
    'Octubre',
    'Noviembre',
    'Diciembre',
  ];

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  constructor(
    public dialog: MatDialog,
    private _mcomdfService: MCOMDFService,
    private _encService: ENCService,
    private _snackBar: MatSnackBar,
    private _iamService: IAMService
  ) {
  }

  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
    this.paginator._intl.itemsPerPageLabel = 'Datos por página';
    this.paginator._intl.firstPageLabel = 'Primera Página';
    this.paginator._intl.lastPageLabel = 'Últmina Página';
    this.paginator._intl.nextPageLabel = 'Siguiente Página';
    this.paginator._intl.previousPageLabel = 'Anterior Página';

    this.dataSource.filterPredicate = function (data, filter: string): boolean {
      let nombreMes = [
        'Enero',
        'Febrero',
        'Marzo',
        'Abril',
        'Mayo',
        'Junio',
        'Julio',
        'Agosto',
        'Septiembre',
        'Octubre',
        'Noviembre',
        'Diciembre',
      ];
      
      return (
        data.ANIO.toString().includes(filter) ||
        nombreMes[data.MES - 1].toString().toLowerCase().includes(filter) ||
        data.DIA.toString().includes(filter) ||
        data.MOTIVO.toString().toLowerCase().includes(filter)
      );
    };
   
    this.obtener();
  }

  obtener() {
    this._mcomdfService.obtener().subscribe((res: any) => {
      if (res.status == 'Token is Expired') {
        this._iamService.logout();
        this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
      }else if (!res.status && res.response.length > 0) {
        this.dataSource.data = res.response;
      }else{
        this.snackAlert( res.response.length > 0 ? res.msg : 'No hay datos para mostrar');
        this.data_empty = true;
        this.dataSource.data = [];
      }
      this.loading = false;
    }, error => {
      if (!error.ok) {
        this.snackAlert('Ocurrió un error inesperado');
      }
      if (error.error.msg != undefined) {
        this.snackAlert(error.error.msg);
      }
      if (error.status == 408) {
        this.snackAlert('Conexion lenta');
      }
    });
  }

  eliminar(item: any) {
    let dato_eliminar = {
      dia: item.DIA,
      mes: item.MES,
      anio: item.ANIO,
      id_usuario_elimina: this._encService.desencriptar(this.usuario_session.IDUSUARIO),
    };
    this._mcomdfService.eliminar(dato_eliminar).subscribe(res => {
      if(!res.error){
        this.obtener();
        this.snackAlert('¡Eliminación Exitosa!');
      }else{
        this.snackAlert(res.msg);
      } 
    }, error => {
      if (!error.ok) {
        this.snackAlert('Ocurrió un error inesperado');
      }
      if (error.error.msg != undefined) {
        this.snackAlert(error.error.msg);
      }
      if (error.status == 408) {
        this.snackAlert('Conexion lenta');
      }
    });
 
    
  }

  obtenerNombreMes(mes: any) {
    return this.nombreMeses[mes - 1];
  }

  applyFilter(filterValue: any) {
    this.dataSource.filter = filterValue.target.value.trim().toLowerCase();
  }

  openDialog(item: any) {
    let dataAction = {
      titulo: 'Eliminar Día Feriado',
      descripcion: `¿Está seguro de eliminar la fecha ${
        item.DIA
      }/${this.obtenerNombreMes(item.MES)}/${item.ANIO}?`,
    };

    const dialogRef = this.dialog.open(AlertaComponent, {
      data: dataAction,
    });

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        this.eliminar(item);
      }
    });
  }

  private processData(fecha: any) {
    let arrFecha = fecha.split('/');
    let data = {
      anio: arrFecha[2].substring(0, 4),
      mes: arrFecha[1],
      dia: arrFecha[0],
    };

    return data;
  }

  private snackAlert(mensaje: string) {
    this._snackBar.open(mensaje, 'Cerrar', {
      duration: 4000,
    });
  }
}
