import { Injectable } from '@angular/core';
import {
  ActivatedRouteSnapshot,
  CanActivate,
  Router,
  RouterStateSnapshot,
  UrlTree,
} from '@angular/router';
import { Observable } from 'rxjs';
import { USERInterface } from '../interfaces/user-interface';
import { ENCService } from '../services/enc/enc.service';
import { IAMService } from '../services/iam/iam.service';
import * as _sodium from 'libsodium-wrappers';
import { Logger } from 'html2canvas/dist/types/core/logger';

@Injectable({
  providedIn: 'root',
})
export class UserGuard implements CanActivate {
  empresas_arr: any[] = [];
  public aux_test: any;
  constructor(private router: Router, private _encService: ENCService) {
    this.empresas_arr = [
      {
        RFC: 'TME700618RC7',
        NOMBRE: 'TIMKEN',
      },
    ];
  }

  async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
    let user = localStorage.getItem('TIMUSERENC');
    
    let rfc_local = localStorage.getItem('RFCEMPRESA')!;
    if (rfc_local === null || rfc_local === undefined) {
      localStorage.setItem('RFCEMPRESA', 'ITTEC');
      localStorage.removeItem('TIMUSERENC');
      localStorage.removeItem('jwt');

      let url = window.location.href;

      // Checar si existen datos del correo en la url
      let exist_data_email = url.includes(';data=');

      // Si no existe un usuario guardado ir a login
      if (user === null || user === undefined || user === '') {
        localStorage.removeItem('TIMUSERENC');
        // Si existen datos en la url acerca del correo, ir a login con esa información
        if (exist_data_email) {
          // Extraer los datos de la url
          let solicitud = url.split(';data=')[1];
          return this.router.navigate(['/iam', { solicitud_datos: solicitud }]);
        }
        return this.router.navigate(['/iam']);
      }

      return this.router.navigate(['/iam']);
    }

    // Extraer posible usuario guardado en el localstorage
    

    // Extraer la url
    let url = window.location.href;

    // Checar si existen datos del correo en la url
    let exist_data_email = url.includes(';data=');

    // Si no existe un usuario guardado ir a login
    if (user === null || user === undefined || user === '') {
      localStorage.removeItem('TIMUSERENC');
      // Si existen datos en la url acerca del correo, ir a login con esa información
      if (exist_data_email) {
        // Extraer los datos de la url
        let solicitud = url.split(';data=')[1];
        return this.router.navigate(['/iam', { solicitud_datos: solicitud }]);
      }
      return this.router.navigate(['/iam']);
    }

    //Combertir los datos de usuario a un objecto
    let obj_user: USERInterface = JSON.parse(user);
    let perfil: string = '';
    await this._encService.desencriptar2(obj_user.PERFIL.toString()).then(
      (data: string) => (perfil = data),
      (error: any) => console.log(error)
    );

    // Si existe datos en la url del correo, ir a MESMAV según su PERFIL
    if (exist_data_email && perfil === '1') {
      let solicitud = url.split(';data=')[1];
      return this.router.navigate([
        '/admin/mesmav',
        { solicitud_datos: solicitud },
      ]);
    } else if (exist_data_email && perfil !== '1') {
      let solicitud = url.split(';data=')[1];
      return this.router.navigate([
        '/admin/mesmav',
        { solicitud_datos: solicitud },
      ]);
    }

    // Si el usuario de perfil Administrador quiere acceder,, negar el paso y redigirlo a sus interfaces
    if (perfil === '1') {
      return this.router.navigate(['/admin/mesmav']);
    }

    return true;
  }
}
