import { Component, ViewChild, AfterViewInit } 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 { MCOMAUService } from 'src/app/services/mco/mcomau/mcomau.service';
import { AlertaComponent } from '../../resources/dialogos/alerta/alerta.component';
import { CambiarContrasenaComponent } from '../../resources/dialogos/cambiar-contrasena/cambiar-contrasena.component';
import { MCOMAUINFOComponent } from './mcomau-info/mcomau-info.component';
import { ResponseData } from 'src/app/interfaces/response-data';
import { MCOMAUInterface } from 'src/app/interfaces/mco/mcomau/mcomau-interface';
import { IAMService } from 'src/app/services/iam/iam.service';
import { MCOMUNService } from 'src/app/services/mco/mcomun/mcomun.service';
import { MCOMPVService } from 'src/app/services/mco/mcompv/mcompv.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';
import { LoginGuard } from 'src/app/auth/login.guard';
import { MCOMAPService } from 'src/app/services/mco/mcomap/mcomap.service';

@Component({
  selector: 'app-mcomau',
  templateUrl: './mcomau.component.html',
  styleUrls: ['./mcomau.component.css'],
})
export class MCOMAUComponent implements AfterViewInit {
  usuarios: any = [];
  loading: Boolean = true;
  data_empty = false;
  filtro_usuarios: number = 0;
  filtro: any = [
    {
      tipo: 1,
      filtro: 'Todos',
    },
    {
      tipo: 2,
      filtro: 'Activos',
    },
    {
      tipo: 3,
      filtro: 'Inactivos',
    },
    {
      tipo: 4,
      filtro: 'Eliminados',
    },
  ];
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );
  usuarios_todos: any;
  displayedColumns: string[] = [
    'no_empleado',
    'nombre',
    'correo',
    'rfc',
    'unidadNegocio',
    'status',
    'accion',
  ];
  dataSource: MatTableDataSource<MCOMAUInterface> =
    new MatTableDataSource<MCOMAUInterface>(this.usuarios);
  unidades_negocio: any = [];
  usuarios_menos: any = [];
  politicas: any = [];
  perfiles: any = [];
  isFilter: boolean = false;
  boton_register_disabled: boolean = true;

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  constructor(
    private router: Router,
    public dialog: MatDialog,
    private _mcomauService: MCOMAUService,
    private _encService: ENCService,
    private _snackBar: MatSnackBar,
    private _iamService: IAMService,
    private _mcomunService: MCOMUNService,
    private _mcomapService: MCOMAPService,
    private _mcompvService: MCOMPVService
  ) {
    
  }

  async 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 nombre_completo = `${data.NOMBRE} ${data.APELLIDO_PATERNO} ${data.APELLIDO_MATERNO}`;

      return (
        nombre_completo.toString().toLowerCase().includes(filter) ||
        data.IDUSUARIO.toLowerCase().includes(filter) ||
        data.EMAIL.toLowerCase().includes(filter) ||
        data.RFCUSUARIO.toLowerCase().includes(filter)
      );
    };

    let unidades = this._mcomunService.obtener().toPromise();
    await unidades.then(
      (res: any) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }
        if (!res.error) {
          this.unidades_negocio = res.response;
        } 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');
        }
      }
    );

    let politicas = this._mcompvService.obtener().toPromise();
    await politicas.then(
      (res: any) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }
        if (!res.error) {
          this.politicas = res.response;
        } 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');
        }
      }
    );

    let usuarios = this._mcomauService.obtenerTodos().toPromise();

    await usuarios.then(
      (res: any) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }
        if (!res.error) {
          this.usuarios_menos = res.response;
        } 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');
        }
      }
    );

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

    this.boton_register_disabled = false;

    await this.obtener();
  }

  async obtener() {
    let usuario = this._mcomauService.obtener().toPromise();

    await usuario.then(
      (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.usuarios_todos = 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: MCOMAUInterface) {
    let datos = {
      numero_empleado: item.IDUSUARIO,
      numero_empleado_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };
    this._mcomauService.eliminar(datos).subscribe(
      (res) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }

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

  cambiarContrasena(contrasena: String, item: any) {
    let datos = {
      numero_empleado: item.IDUSUARIO,
      numero_empleado_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
      password: contrasena,
      password_confirmation: contrasena,
    };

    this._mcomauService.cambiarContrasena(datos).subscribe(
      (res) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }

        if (!res.error) {
          this.snackAlert('¡Contraseña Cambiada!');
        } 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');
        }
      }
    );
  }

  bloquear(item: any) {
    let datos = {
      numero_empleado: item.IDUSUARIO,
      numero_empleado_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };

    this._mcomauService.bloquear(datos).subscribe(
      (res) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }
        if (!res.error) {
          this.obtener();
          this.snackAlert('¡Usuario Bloqueado!');
        } 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');
        }
      }
    );
  }

  desbloquear(item: any) {
    let datos = {
      user_id_empleado: item.IDUSUARIO,
      user_id_empleado_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };

    this._mcomauService.desbloquear(datos).subscribe(
      (res) => {
        if (res.status == 'Token is Expired') {
          this._iamService.logout();
          this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
        }

        if (!res.error) {
          this.obtener();
          this.snackAlert('¡Usuario Desbloqueado!');
        } 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();
  }

  filterUser() {
    let usuarios_aux: MCOMAUInterface[] = [];
    switch (this.filtro_usuarios) {
      case 1:
        usuarios_aux = this.usuarios_todos;

        break;
      case 2:
        this.usuarios_todos.forEach((element: MCOMAUInterface) => {
          if (element.ESTATUS === 'Activo') {
            usuarios_aux.push(element);
          }
        });
        break;
      case 3:
        this.usuarios_todos.forEach((element: MCOMAUInterface) => {
          if (element.ESTATUS === 'Inactivo') {
            usuarios_aux.push(element);
          }
        });

        break;
      case 4:
        this.usuarios_todos.forEach((element: MCOMAUInterface) => {
          if (element.ESTATUS === 'Eliminado') {
            usuarios_aux.push(element);
          }
        });

        break;
      default:
        this.snackAlert('Ocurrió un error inesperado');
        break;
    }
    usuarios_aux.length > 0
      ? (this.data_empty = false)
      : (this.data_empty = true);
    this.dataSource.data = usuarios_aux;

    this.isFilter = true;
  }

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

    switch (action) {
      case 'Eliminar':
        dataAction = {
          titulo: 'Eliminar Usuario',
          descripcion: `¿Esta seguro de eliminar a ${item.NOMBRE}?`,
        };
        break;
      case 'Bloquear':
        dataAction = {
          titulo: 'Bloquear Acceso',
          descripcion: `¿Esta seguro bloquear el acceso a ${item.NOMBRE}?`,
        };
        break;
      case 'Desbloquear':
        dataAction = {
          titulo: 'Desbloquear Acceso',
          descripcion: `¿Esta seguro desbloquear el acceso a ${item.NOMBRE}?`,
        };
        break;
      default:
        this.snackAlert('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;
          case 'Bloquear':
            this.bloquear(item);
            break;
          case 'Desbloquear':
            this.desbloquear(item);
            break;
          default:
            this.snackAlert('Ocurrió un error inesperado');
            break;
        }
      }
    });
  }

  openDialogPassword(item: any) {
    const dialogRef = this.dialog.open(CambiarContrasenaComponent, {
      data: item,
    });

    dialogRef.afterClosed().subscribe((result) => {
      if (result != '') {
        this.cambiarContrasena(result, item);
      }
    });
  }

  openDialogInfo(item: MCOMAUInterface) {
    this.dialog.open(MCOMAUINFOComponent, {
      data: item,
    });
  }

  actionForm(action: String, item: any = null) {
    let data = item != null ? JSON.stringify(item) : null;

    let unidades = JSON.stringify(this.unidades_negocio);
    let politicas = JSON.stringify(this.politicas);
    let usuarios_menos = JSON.stringify(this.usuarios_menos);
    let perfiles = JSON.stringify(this.perfiles);

    this.router.navigate([
      '/admin/mcomau-form',
      {
        action: action,
        data: data,
        unidades: unidades,
        politicas: politicas,
        usuarios_menos: usuarios_menos,
        perfiles: perfiles,
      },
    ]);
  }

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