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

import { MCOMPVService } from 'src/app/services/mco/mcompv/mcompv.service';
import { MCOMPVFORMComponent } from './mcompv-form/mcompv-form.component';
import { AlertaComponent } from '../../resources/dialogos/alerta/alerta.component';
import { VerDiasVacacionalesComponent } from './ver-dias-vacacionales/ver-dias-vacacionales.component';
import { VerDiasDescansoComponent } from './ver-dias-descanso/ver-dias-descanso.component';
import { VerDiasEarnasyougoComponent } from './ver-dias-earnasyougo/ver-dias-earnasyougo.component';
import { Router } from '@angular/router';
import { IAMService } from 'src/app/services/iam/iam.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';

@Component({
  selector: 'app-mcompv',
  templateUrl: './mcompv.component.html',
  styleUrls: ['./mcompv.component.css'],
})
export class MCOMPVComponent implements AfterViewInit {
  loading: Boolean = true;
  data_empty = false;
  displayedColumns: string[] = [
    'politica',
    'earn_as_you_go',
    'accion',
  ];
  politicaVacaciones = [];
  usuario_session: USERInterface;

  dataSource = new MatTableDataSource<any>(this.politicaVacaciones);

  constructor(
    public dialog: MatDialog,
    private _mcompvService: MCOMPVService,
    private _snackBar: MatSnackBar,
    private router: Router,
    private _encService: ENCService,
    private _iamService: IAMService
  ) {
    this.usuario_session = JSON.parse(localStorage.getItem('TIMUSERENC')!);
  }

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  ngAfterViewInit() {
    this.obtener();

    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 {
      return (
        data.NOMBREPOLITICA.toString().toLowerCase().includes(filter) ||
        data.EARNASYOUGO.toString().toLowerCase().includes(filter) 
      );
    };
  }

  obtener() {
    this._mcompvService.obtener().subscribe((res) => {      
      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;
        this.data_empty = false;
      }else{
        this.snackAlert( res.response.length > 0 ? res.msg : 'No hay datos para mostrar');
        this.data_empty = true;
      }
      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');
      }
    });
  }

  async eliminar(item: any) {    
    let obj_delete: any = {
      id_usuario_elimina: this._encService.desencriptar(this.usuario_session.IDUSUARIO),
      id_politica: item.IDPOLITICA
    }
    let eliminar = this._mcompvService.eliminar(obj_delete).toPromise();
    await eliminar.then((res) => {
      if (res?.status == 'Token is Expired') {
        this._iamService.logout();
        this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
      }
      if (!res?.status) {
        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');
      }
    });
  }

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

  openDialog(item: any, action: String) {
    if (item.id != null) {
      let dataAction = {
        titulo: 'Eliminación Denegada',
        descripcion: `Está política no se puede eliminar`,
      };

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

    let dataAction = {
      titulo: 'Eliminar Política',
      descripcion: `¿Está seguro de eliminar la política ${item.NOMBREPOLITICA}?`,
    };

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

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        switch (action) {
          case 'Eliminar':
            this.eliminar(item);
            break;
          default:
            this.snackAlert('Ocurrió un error inesperado');
            break;
        }
      }
    });
  }

  openDialogDiasDescanso(item: any, action: String) {
    let dataAction = {
      modulo: 'MCOMPV',
      item: item,
    };

    this.dialog.open(VerDiasDescansoComponent, {
      data: dataAction,
    });
  }

  openDialogDiasVacacionales(item: any, action: String) {
    let dataAction = {
      modulo: 'MCOMPV',
      item: item,
    };

    this.dialog.open(VerDiasVacacionalesComponent, {
      data: dataAction,
    });
  }

  openDialogDiasEarnAsYouGo(item: any, action: String) {
    let dataAction = {
      modulo: 'MCOMPV',
      item: item,
    };

    this.dialog.open(VerDiasEarnasyougoComponent, {
      data: dataAction,
    });
  }

  formAccion(accion: String, item: any = null) {
    let datos = item != null ? JSON.stringify(item) : null;
    this.router.navigate([
      '/admin/mcompv-form',
      { accion: accion, data: datos },
    ]);
  }

  formatDate(fecha:string){
    let arrFecha = fecha.split("-");
    return `${arrFecha[2]}-${arrFecha[1]}-${arrFecha[0]}`;
  }

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