import { Component, ViewChild, AfterViewInit, OnInit } 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 { MCOMUNFORMComponent } from './mcomun-form/mcomun-form.component';
import { MCOMUNService } from '../../../services/mco/mcomun/mcomun.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { IAMService } from '../../../services/iam/iam.service';
import { ENCService } from 'src/app/services/enc/enc.service';

@Component({
  selector: 'app-mcomun',
  templateUrl: './mcomun.component.html',
  styleUrls: ['./mcomun.component.css'],
})
export class MCOMUNComponent implements AfterViewInit {
  loading: boolean = true;
  unidades_negocio: any[] = [];
  data_empty = false;

  displayedColumns: string[] = ['NOMBREUNIDAD', 'RFCUNIDAD', 'accion'];
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );

  dataSource = new MatTableDataSource<any>(this.unidades_negocio);
  @ViewChild(MatPaginator) paginator!: MatPaginator;

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

  ngAfterViewInit(): void {
    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 nombreCompleto = `${data.NOMBREUNIDAD}`;
      return (
        nombreCompleto.toString().toLowerCase().includes(filter) ||
        data.RFCUNIDAD.toString().toLowerCase().includes(filter)
      );
    };
    this.obtener();
  }

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

  obtener() {
    this._mcomunService.consultaUnidades().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;
          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');
        }
      }
    );
  }

  registrar(unidad: any) {
    this._mcomunService.registrarUnidad(unidad).subscribe(
      (res) => {
        if (!res.status) {
          this.obtener();
          this.snackAlert('¡Registro Exitoso!');
        } 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');
        }
      }
    );
    
  }

  modificar(unidad: any) {
    let unidadAux = {
      rfc_unidad: unidad.rfc_unidad,
      nombre: unidad.nombre,
      id_usuario_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };

    this._mcomunService.modificarUnidad(unidadAux).subscribe(
      (res) => {
        if (!res.status) {
          this.obtener();
          this.snackAlert('¡Unidad de Negocio Modificada!');
        } 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');
        }
      }
    );
  }

  eliminar(unidad: any) {
    let unidadAux = {
      rfc_unidad: unidad.RFCUNIDAD,
      id_usuario_elimina: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };
    this._mcomunService.eliminarUnidad(unidadAux).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) {
          this.obtener();
          this.snackAlert('!Eliminación de unidad existoso!');
        } else {
          this.snackAlert( res.response.length > 0 ? res.msg : 'No hay datos para mostrar');
          this.data_empty = true;
        }
      },
      (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');
        }
      }
    );
  }

  openDialogForm(action: string, item: any = {}) {
    let dataAction = {
      action: action,
      item: item,
    };
    const dialogRef = this.dialog.open(MCOMUNFORMComponent, {
      data: dataAction,
    });

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        if (action == 'Registrar') {
          result.rfc_unidad = result.rfc_unidad.toUpperCase();
          this.registrar(result);
        } else {
          result.rfc_unidad = item.RFCUNIDAD;
          this.modificar(result);
        }
      }
    });
  }

  openAlertDialog(item: any = {}) {
    let dataAction = {
      titulo: 'Eliminar unidad de negocio',
      item,
      descripcion: '¿Realmente desea eliminar la unidad de negocio? ',
    };

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

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        this.eliminar(item);
      }
    });
  }
  private snackAlert(mensaje: string) {
    this._snackBar.open(mensaje, 'Cerrar', {
      duration: 4000,
    });
  }
}
