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 { MCOMORService } from '../../../services/mco/mcomor/mcomor.service';
import { MCOMORFORMComponent } from './mcomor-form/mcomor-form.component';
import { IAMService } from 'src/app/services/iam/iam.service';
import { MCOMAUService } from '../../../services/mco/mcomau/mcomau.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';

@Component({
  selector: 'app-mcomor',
  templateUrl: './mcomor.component.html',
  styleUrls: ['./mcomor.component.css'],
})
export class MCOMORComponent implements AfterViewInit {
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );
  organigrama: any = [];
  loading: Boolean = true;
  hideBtn = false;
  data_empty = false;
  edit_disabled: boolean = false;

  displayedColumns: string[] = [
    'nombre',
    'jefe_directo',
    'jefe_sustituto',
    'accion',
  ];
  dataSource = new MatTableDataSource<any>(this.organigrama);

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  constructor(
    public dialog: MatDialog,
    private _mcomorService: MCOMORService,
    private _mcomauService: MCOMAUService,
    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 {
      return (
        data.ORGA_IDUS.toString().toLowerCase().includes(filter) ||
        data.ORGA_JEDI.toLowerCase().includes(filter)
      );
    };

    this.obtener();
  }

  OnInit() {
    this.obtener();
  }

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

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

  modificar(organigrama: any) {
    // let organigramaAux = {
    //   id_usuario: organigrama.id_usuario_aux.IDUSUARIO,
    //   id_jefe_directo: organigrama.id_jefe_directo.IDUSUARIO,
    //   id_jefe_sustituto: organigrama.id_jefe_sustituto.IDUSUARIO,
    //   id_usuario_modifica: this._encService.desencriptar(this.usuario_session.IDUSUARIO),
    // };

    let organigramaAux = {
      id_usuario: organigrama.id_usuario_aux.IDUSUARIO,
      id_jefe_directo: organigrama.id_jefe_directo.IDUSUARIO,

      id_usuario_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };

    if (organigrama.id_jefe_sustituto != null) {
      let id_jefe_sustituto = {
        id_jefe_sustituto: organigrama.id_jefe_sustituto.IDUSUARIO,
      };
      organigramaAux = Object.assign(organigramaAux, id_jefe_sustituto);
    }

    this._mcomorService.modificarOrganigrama(organigramaAux);
    this.obtener();
    this.OnInit();
  }

  async openDialogForm(action: string, item: any = {}) {
    this.edit_disabled = true;

    let usuarios: any = [];
    let usuarios_menos: any = [];
    let response_user = this._mcomauService.obtener().toPromise();

    await response_user.then((res: any) => {
      usuarios = res.response;
    }, (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');
      }
    })

    if (action === 'Modificar') {
      let response = this._mcomauService.obtenerMenos(this.obtenerIDUsuario(item)[0]).toPromise()
      await response.then((resp:any) => {
        usuarios_menos = resp.response;
      }, 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');
        }
      });
    }
    //await sleep(700);

    let dataAction = {
      action: action,
      item: item,
      usuarios_menos: usuarios_menos,
      usuarios: usuarios,
    };

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

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

    this.edit_disabled = false;
  }

  private obtenerIDUsuario(item: any) {
    let arrIDUsuarios = [];

    let arr1 = item.ORGA_IDUS.split('(');
    let IDUsuario1 = arr1[1].split(')');
    arrIDUsuarios.push(IDUsuario1[0]);

    let arr2 = item.ORGA_JEDI.split('(');
    let IDUsuario2 = arr2[1].split(')');
    arrIDUsuarios.push(IDUsuario2[0]);

    if (item.ORGA_JESU != undefined) {
      let arr3 = item.ORGA_JESU.split('(');
      let IDUsuario3 = arr3[1].split(')');
      arrIDUsuarios.push(IDUsuario3[0]);
    }

    return arrIDUsuarios;
  }

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