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 { MCOMAPFORMComponent } from './mcomap-form/mcomap-form.component';
import { MCOMAPService } from 'src/app/services/mco/mcomap/mcomap.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';

@Component({
  selector: 'app-mcomap',
  templateUrl: './mcomap.component.html',
  styleUrls: ['./mcomap.component.css'],
})
export class MCOMAPComponent implements AfterViewInit {
  perfiles: any[] = [];
  loading: Boolean = true;
  data_empty = false;
  displayedColumns: string[] = ['ID', 'perfil', 'accion'];
  dataSource = new MatTableDataSource<any>(this.perfiles);
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );

  @ViewChild(MatPaginator) paginator!: MatPaginator;

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

  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 {
      return data.toLowerCase().includes(filter);
    };
    this.obtener();
  }

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

        this.loading = false;
      },
      (error: any) => {
        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 resp = {
      id_usuario_elimina: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
      id_perfil: item.id.toString(),
    };
    this._mcomapService.eliminar(resp);
    this.obtener();
    this.ngAfterViewInit();
  }

  registrar(item: any) {
    let resp = {
      rfc_empresa: this.usuario_session.RFCEMPRESA,
      tipo_perfil: item.perfil,
      id_usuario_registra: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };
    this._mcomapService.crear(resp);
    this.obtener();
    this.ngAfterViewInit();
  }

  modificar(item: any, id: string) {
    let resp = {
      id_perfil: id.toString(),
      tipo_perfil: item.perfil,
      id_usuario_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };
    this._mcomapService.modificar(resp);
    this.obtener();
    this.ngAfterViewInit();
  }

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

  openDialog(item: any, action: String) {
    let dataAction = {};

    switch (action) {
      case 'Eliminar':
        dataAction = {
          titulo: 'Eliminar Perfil',
          descripcion: `¿Está seguro de eliminar el perfil ${item.perfil}?`,
        };
        break;
      default:
        alert('Ocurrió un error inesperado');
        break;
    }

    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;
        }
      }
    });
  }

  openDialogForm(accion: string, item: any = {}) {
    let data_accion = {
      accion: accion,
      item: item,
    };

    const dialogRef = this.dialog.open(MCOMAPFORMComponent, {
      data: data_accion,
    });

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        if (accion == 'Registrar') {
          this.registrar(result);
        } else {
          this.modificar(result, item.id);
        }
      }
    });
  }

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