import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
import { Router } from '@angular/router';

import { MCOMAUService } from 'src/app/services/mco/mcomau/mcomau.service';
import { AlertaComponent } from 'src/app/components/resources/dialogos/alerta/alerta.component';

import 'moment/locale/es';
import { MCOMAURegistrarInterface } from 'src/app/interfaces/mco/mcomau/mcomau-registrar-interface';
import { MCOMAUModificarInterface } from 'src/app/interfaces/mco/mcomau/mcomau-modificar-interface';

import { IAMService } from 'src/app/services/iam/iam.service';
import { MCOMAUInterface } from 'src/app/interfaces/mco/mcomau/mcomau-interface';

import {
  MAT_MOMENT_DATE_FORMATS,
  MomentDateAdapter,
  MAT_MOMENT_DATE_ADAPTER_OPTIONS,
} from '@angular/material-moment-adapter';
import {
  DateAdapter,
  MAT_DATE_FORMATS,
  MAT_DATE_LOCALE,
} from '@angular/material/core';
import { MCOMUNService } from 'src/app/services/mco/mcomun/mcomun.service';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';
import { parse } from 'path';

@Component({
  selector: 'app-mcomau-form',
  templateUrl: './mcomau-form.component.html',
  styleUrls: ['./mcomau-form.component.css'],
  providers: [
    { provide: MAT_DATE_LOCALE, useValue: 'es-MX ' },
    {
      provide: DateAdapter,
      useClass: MomentDateAdapter,
      deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS],
    },
    { provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS },
  ],
})
export class MCOMAUFORMComponent implements OnInit {
  formGroup: FormGroup;
  titulo: String = '';
  usuario: MCOMAUInterface = null!;
  usuarios_menos: any = null!;
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );

  hide1 = true;
  hide2 = true;

  unidades_negocio: any;
  politicas: any;
  perfiles: any;

  turnos = [{ turno: 'Matutino' }, { turno: 'Vespertino' }];

  constructor(
    private router: Router,
    private activatedRoute: ActivatedRoute,
    public dialog: MatDialog,
    private _mcomauService: MCOMAUService,
    private _snackBar: MatSnackBar,
    private _iamService: IAMService,
    private _encService: ENCService
  ) {
    this.activatedRoute.params.subscribe((params) => {
      this.titulo = params['action'];
      this.usuario = JSON.parse(params['data']);
      (this.unidades_negocio = JSON.parse(params['unidades'])),
        (this.politicas = JSON.parse(params['politicas'])),
        (this.usuarios_menos = JSON.parse(params['usuarios_menos'])),
        (this.perfiles = JSON.parse(params['perfiles']));
    });

    this.formGroup = this.createFormGroup();
  }

  ngOnInit(): void {}

  private createFormGroup() {
    if (this.titulo == 'Modificar') {
      let anio = parseInt(this.usuario.FECHA_INGRESO.split("-")[0])
      let mes = parseInt(this.usuario.FECHA_INGRESO.split("-")[1])
      let dia = parseInt(this.usuario.FECHA_INGRESO.split("-")[2])
      
      
      const found_index_unidad = (element: any) =>
        element.NOMBREUNIDAD == this.usuario.UNIDADNEGOCIO;
      let unidad = this.unidades_negocio.findIndex(found_index_unidad);

      const found_index_politica = (element: any) =>
        element.NOMBREPOLITICA == this.usuario.POLITICA;
      let politica = this.politicas.findIndex(found_index_politica);

      const found_index_perfil = (element: any) =>
        element.id == this.usuario.PERFIL;
      let perfil = this.perfiles.findIndex(found_index_perfil);

      const found_index_turno = (element: any) =>
        element.turno == this.usuario.TURNO;
      let turno = this.turnos.findIndex(found_index_turno);

      return new FormGroup({
        id_usuario: new FormControl(
          { value: this.usuario.IDUSUARIO, disabled: true },
          Validators.required
        ),
        nombre: new FormControl(this.usuario.NOMBRE, Validators.required),
        ape_p: new FormControl(
          this.usuario.APELLIDO_PATERNO,
          Validators.required
        ),
        ape_m: new FormControl(this.usuario.APELLIDO_MATERNO),
        rfc_usuario: new FormControl(
          this._encService.desencriptar(this.usuario_session.RFCEMPRESA),
          Validators.required
        ),
        email: new FormControl(this.usuario.EMAIL, Validators.email),
        fecha_ingreso_laboral: new FormControl(new Date(anio, mes-1, dia), Validators.required),
        numero_empleado_modifica: new FormControl(
          this._encService.desencriptar(this.usuario_session.IDUSUARIO),
          Validators.required
        ),
        tipo_usuario: new FormControl(
          this.perfiles[perfil],
          Validators.required
        ),
        politica: new FormControl(
          this.politicas[politica],
          Validators.required
        ),
        rfc_unidad_negocio: new FormControl(
          this.unidades_negocio[unidad],
          Validators.required
        ),
        turno: new FormControl(this.turnos[turno], Validators.required),
      });
    } else {
      return new FormGroup({
        numero_empleado: new FormControl('', Validators.required),
        nombre: new FormControl('', Validators.required),
        ape_p: new FormControl('', Validators.required),
        ape_m: new FormControl(''),
        id_usuario: new FormControl('', Validators.required),
        rfc_usuario: new FormControl('', [
          Validators.required,
          Validators.minLength(13),
        ]),
        fecha_ingreso_laboral: new FormControl('', Validators.required),
        email: new FormControl('', Validators.email),
        password: new FormControl('', [Validators.required, Validators.min(8)]),
        password_confirmation: new FormControl('', [
          Validators.required,
          Validators.min(8),
        ]),
        tipo_usuario: new FormControl('', Validators.required),
        politica: new FormControl('', Validators.required),
        turno: new FormControl('', Validators.required),
        rfc_unidad_negocio: new FormControl('', Validators.required),
        numero_empleado_registra: new FormControl(
          this._encService.desencriptar(this.usuario_session.IDUSUARIO)
        ),
        id_jefe_directo: new FormControl('', Validators.required),
        id_jefe_sustituto: new FormControl('' ),
      });
    }
  }

  get numero_empleado() {
    return this.formGroup.get('numero_empleado');
  }

  get id_usuario() {
    return this.formGroup.get('id_usuario');
  }
  get rfc_unidad_negocio() {
    return this.formGroup.get('rfc_unidad_negocio');
  }
  get nombre() {
    return this.formGroup.get('nombre');
  }
  get ape_p() {
    return this.formGroup.get('ape_p');
  }
  get ape_m() {
    return this.formGroup.get('ape_m');
  }
  get rfc_usuario() {
    return this.formGroup.get('rfc_usuario');
  }
  get email() {
    return this.formGroup.get('email');
  }
  get password() {
    return this.formGroup.get('password');
  }
  get password_confirmation() {
    return this.formGroup.get('password_confirmation');
  }
  get numero_empleado_registra() {
    return this.formGroup.get('numero_empleado_registra');
  }
  get fecha_ingreso_laboral() {
    return this.formGroup.get('fecha_ingreso_laboral');
  }
  get tipo_usuario() {
    return this.formGroup.get('tipo_usuario');
  }
  get politica() {
    return this.formGroup.get('politica');
  }

  get numero_empleado_modifica() {
    return this.formGroup.get('numero_empleado_modifica');
  }

  get id_jefe_directo() {
    return this.formGroup.get('id_jefe_directo');
  }

  get id_jefe_sustituto() {
    return this.formGroup.get('id_jefe_sustituto');
  }

  get turno() {
    return this.formGroup.get('turno');
  }

  openDialog() {
    let dataAction = {};

    switch (this.titulo) {
      case 'Registro':
        dataAction = {
          titulo: 'Registrar Usuario',
          descripcion: `¿Está seguro de registrar a ${this.nombre?.value}?`,
        };
        break;
      case 'Modificar':
        dataAction = {
          titulo: 'Modificar Usuario',
          descripcion: `¿Está seguro de modificar a ${this.nombre?.value}?`,
        };
        break;
      default:
        alert('Ocurrió un error inesperado');
        break;
    }

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

    dialogRef.afterClosed().subscribe((result) => {
      if (result) {
        switch (this.titulo) {
          case 'Registro':
            this.registrar();
            break;
          case 'Modificar':
            this.modificar();
            break;
          default:
            this.snackAlert('Ocurrió un error inesperado');
            break;
        }
      }
    });
  }

  registrar() {
    let datosForm: MCOMAURegistrarInterface = this.processDataRegister();
    this._mcomauService.crear(datosForm).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.router.navigate(['/admin/mcomau']);
          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() {
    let datosForm: MCOMAUModificarInterface = this.processDataModificar();
    this._mcomauService.modificar(datosForm).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('¡Modificació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');
      }
    });
    
    this.router.navigate(['/admin/mcomau']);
  }

  generatePassword() {
    let chars =
      '0123456789abcdefghijklmnopqrstuvwxyz!@#$%^&*-_=+ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    let passwordLength = 12;
    let password = '';
    for (let i = 0; i <= passwordLength; i++) {
      let randomNumber = Math.floor(Math.random() * chars.length);
      password += chars.substring(randomNumber, randomNumber + 1);
    }
    this.password?.setValue(password);
    this.password_confirmation?.setValue(password);
  }

  private processDataRegister(): MCOMAURegistrarInterface {
    let datosForm: MCOMAURegistrarInterface = {
      numero_empleado: this.numero_empleado?.value,
      user_id: this.id_usuario?.value,
      rfc_empresa: this.usuario_session.RFCEMPRESA,
      turno: this.turno?.value.turno,
      perfil: this.tipo_usuario?.value.id,
      politica: this.politica?.value.IDPOLITICA,
      nombre: this.nombre?.value,
      ape_p: this.ape_p?.value,
      rfc_usuario: this.rfc_usuario?.value,
      email: this.email?.value,
      password: this.password?.value,
      password_confirmation: this.password_confirmation?.value,
      rfc_unidad_negocio: this.rfc_unidad_negocio?.value.RFCUNIDAD,
      fecha_ingreso_laboral: this.formatDate(this.fecha_ingreso_laboral?.value),
      user_id_empleado_registra: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
      user_id_jefe_directo: this.id_jefe_directo?.value.IDUSUARIO,
      user_id_jefe_sustituto: this.id_jefe_sustituto?.value.IDUSUARIO,
    };

    if (this.ape_m?.value != '') {
      let ape_m = {
        ape_m: this.ape_m?.value,
      };
      datosForm = Object.assign(datosForm, ape_m);
    }

    return datosForm;
  }

  private processDataModificar(): MCOMAUModificarInterface {

    let datosForm: MCOMAUModificarInterface = {
      user_id: this.id_usuario?.value,
      turno: this.turno?.value.turno,
      perfil: this.tipo_usuario?.value.id,
      politica: this.politica?.value.IDPOLITICA,
      nombre: this.nombre?.value,
      ape_p: this.ape_p?.value,
      rfc_usuario: this.rfc_usuario?.value,
      rfc_unidad_negocio: this.rfc_unidad_negocio?.value.RFCUNIDAD,
      fecha_ingreso_laboral: this.formatDate(this.fecha_ingreso_laboral?.value),
      numero_empleado_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };

    if (this.ape_m?.value != '') {
      let ape_m = {
        ape_m: this.ape_m?.value,
      };
      datosForm = Object.assign(datosForm, ape_m);
    }

    return datosForm;
  }

  private formatDate(date: Date) {
    var d = new Date(date),
      month = '' + (d.getMonth() + 1),
      day = '' + d.getDate(),
      year = d.getFullYear();

    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;

    return [year, month, day].join('-');
  }

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