import { AfterViewInit, Component, ViewChild } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { MatPaginator } from '@angular/material/paginator';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTableDataSource } from '@angular/material/table';
import { ActivatedRoute, Router } from '@angular/router';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ENCService } from 'src/app/services/enc/enc.service';
import { IAMService } from 'src/app/services/iam/iam.service';
import { MCOMPVService } from 'src/app/services/mco/mcompv/mcompv.service';

@Component({
  selector: 'app-mcompv-form',
  templateUrl: './mcompv-form.component.html',
  styleUrls: ['./mcompv-form.component.css'],
})
export class MCOMPVFORMComponent implements AfterViewInit {
  formGroup: FormGroup;
  formGroupTable: FormGroup;
  toppings = new FormControl();
  accion: string = '';
  datos: any;
  cont: number = 0;
  anios_vacaciones: any[] = [];
  usuario_session: USERInterface;
  tabla_datos: any[] = [];
  displayedColumns: string[] = ['anio', 'dia', 'accion'];
  dataSource = new MatTableDataSource<any>(this.tabla_datos);
  dias_acro = [
    "Lu", "Ma", "Mi", "Ju", "Vi", "Sa", "Do"
  ]
  diasDeLaSemana: any[] = [
    {
      dia: 'Lunes',
      acron: 'Lu'
    },
    {
      dia: 'Martes',
      acron: 'Ma'
    },
    {
      dia: 'Miercoles',
      acron: 'Mi'
    },
    {
      dia: 'Jueves',
      acron: 'Ju'
    },
    {
      dia: 'Viernes',
      acron: 'Vi'
    },
    {
      dia: 'Sábado',
      acron: 'Sa'
    },
    {
      dia: 'Domingo',
      acron: 'Do'
    },
  ];

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
  }

  constructor(
    private _router: Router,
    private activatedRoute: ActivatedRoute,
    private _mcompvService: MCOMPVService,
    private _iamService: IAMService,
    private _encService: ENCService,
    private _snackBar: MatSnackBar
  ) {
    this.usuario_session = JSON.parse(localStorage.getItem('TIMUSERENC')!);

    this.activatedRoute.params.subscribe((params) => {
      this.accion = params['accion'];
      this.datos = JSON.parse(params['data']);
    });
    
    for (let index = 1; index <= 39; index++) {
      let obj_anio = {
        anio: index,
      };
      this.anios_vacaciones.push(obj_anio);
    }
    this.formGroup = this.createFormGroup();
    this.formGroupTable = this.createFormGroupTable();
  }

  private createFormGroup() {
    if (this.accion == 'Registro') {
      return new FormGroup({
        nombre_politica: new FormControl('', Validators.required),
        dias_descanso: new FormControl('', Validators.required),
        earn_as_you_go: new FormControl(false),
        dias_vacaciones: new FormControl(),
      });
    } else {
      let filtro_dias_descanso = this.datos.DIASDESCANSO.filter((element:any) => element.descansa == "Si");
      let index_arr: number[] = []
      for (let index = 0; index < filtro_dias_descanso.length; index++) {
        index_arr.push(this.diasDeLaSemana.findIndex(element => element.acron == filtro_dias_descanso[index].dia));
      }
      let arr_dias: any[] = []
      index_arr.forEach(element => {
        arr_dias.push(this.diasDeLaSemana[element]);
      });
      
      this.datos.DIASVACACIONESAPLICABLES.forEach((element:any) => {
        this.dataSource.data = this.modificar_anios_tabla(element.anio, element.dias);
      });
      
      let dias_removidos = this.anios_vacaciones.filter(object1 => {
        return !this.datos.DIASVACACIONESAPLICABLES.some((object2:any) => {
          return object1.anio === object2.anio;
        });
      });

      this.anios_vacaciones = dias_removidos;

      return new FormGroup({
        nombre_politica: new FormControl(this.datos.NOMBREPOLITICA, Validators.required),
        dias_descanso: new FormControl(arr_dias, Validators.required),
        earn_as_you_go: new FormControl(this.datos.EARNASYOUGO == "Si"),
        dias_vacaciones: new FormControl(this.datos.DIASVACACIONESAPLICABLES),
      });
    }
  }

  private createFormGroupTable() {
    return new FormGroup({
      data_anio: new FormControl(),
      data_dias: new FormControl(),
    });
  }


  public registrar() {
    
    var dias_vacaciones_str = "{";
    this.dataSource.data.forEach(element=>{
      
      let datos = `"${element.anio}":"${element.dias}",`;
      dias_vacaciones_str += datos;
    });
    dias_vacaciones_str = dias_vacaciones_str.substring(0, dias_vacaciones_str.length - 1);
    dias_vacaciones_str = dias_vacaciones_str + "}";

    var dias_descanso_str:string = "{";

    this.dias_acro.forEach((element0:string) => {  
      this.dias_descanso?.value.forEach((element1:any) => {
        if ( ! dias_descanso_str.includes(`"${element0}":"Si"`)) {
          if(dias_descanso_str.includes(`"${element0}":"No"`) && element0 == element1.acron){
            dias_descanso_str = dias_descanso_str.replace(`"${element0}":"No"`, `"${element0}":"Si"`);
          }else if (element0 == element1.acron) {
            dias_descanso_str+= `"${element0}":"Si",`;
          }else if( ! dias_descanso_str.includes(`"${element0}":"No"`)){
            dias_descanso_str+= `"${element0}":"No",`;
          }
        }
      });
    });

    dias_descanso_str = dias_descanso_str.substring(0, dias_descanso_str.length - 1);
    dias_descanso_str = dias_descanso_str + "}";
    
    let obj_register = {
      rfc_empresa: this.usuario_session.RFCEMPRESA,
      nombre_politica: this.nombre_politica?.value,
      dias_vacaciones: dias_vacaciones_str,
      earn_as_you_go: this.earn_as_you_go?.value ? 'Si' : 'No',
      dias_descanso: dias_descanso_str,
      id_usuario_registra: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
    };


    let insertar = this._mcompvService.crear(obj_register).toPromise();
    insertar.then((res) => {
      if (res?.status == 'Token is Expired') {
        this._iamService.logout();
        this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
      }
      if (!res?.status) {
        this._router.navigate(['/admin/mcompv']);
        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');
      }
    });

  }

  public modificar(){
    var dias_vacaciones_str = "{";
    this.dataSource.data.forEach(element=>{
      
      let datos = `"${element.anio}":"${element.dias}",`;
      dias_vacaciones_str += datos;
    });
    dias_vacaciones_str = dias_vacaciones_str.substring(0, dias_vacaciones_str.length - 1);
    dias_vacaciones_str = dias_vacaciones_str + "}";

    var dias_descanso_str:string = "{";

    this.dias_acro.forEach((element0:string) => {  
      this.dias_descanso?.value.forEach((element1:any) => {
        if ( ! dias_descanso_str.includes(`"${element0}":"Si"`)) {
          if(dias_descanso_str.includes(`"${element0}":"No"`) && element0 == element1.acron){
            dias_descanso_str = dias_descanso_str.replace(`"${element0}":"No"`, `"${element0}":"Si"`);
          }else if (element0 == element1.acron) {
            dias_descanso_str+= `"${element0}":"Si",`;
          }else if( ! dias_descanso_str.includes(`"${element0}":"No"`)){
            dias_descanso_str+= `"${element0}":"No",`;
          }
        }
      });
    });

    dias_descanso_str = dias_descanso_str.substring(0, dias_descanso_str.length - 1);
    dias_descanso_str = dias_descanso_str + "}";
    
    let obj_modificar = {
      nombre_politica: this.nombre_politica?.value,
      dias_vacaciones: dias_vacaciones_str,
      earn_as_you_go: this.earn_as_you_go?.value ? 'Si' : 'No',
      dias_descanso: dias_descanso_str,
      id_usuario_modifica: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
      id_politica: this.datos.IDPOLITICA
    };
    
    let insertar = this._mcompvService.modificar(obj_modificar).toPromise();
    insertar.then((res) => {
      if (res?.status == 'Token is Expired') {
        this._iamService.logout();
        this.snackAlert('Sesión expirada. Vuelva a iniciar sesión');
      }
      if (!res?.status) {
        this._router.navigate(['/admin/mcompv']);
        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');
      }
    });

  }


  public agregar_tabla() {
    
    this.dataSource.data = this.modificar_anios_tabla(this.data_anio?.value.anio, this.data_dias?.value);
    
    let filtro = this.anios_vacaciones.filter(element => element.anio <= this.data_anio?.value.anio);
    
    if ( filtro.length !== 0) {
      filtro.forEach( element0 => {
        let index = this.anios_vacaciones.findIndex(element1 => element1.anio == element0.anio);
        this.anios_vacaciones.splice(index, 1)
      });
    }

    this.formGroupTable.reset();
    this.ngAfterViewInit();
  }

  private modificar_anios_tabla(anio:number, dias:number){
    let obj_add: any = {};
    if (this.dataSource.data.length == 0) {
      if (anio > 1) {
        obj_add = {
          anio: `1-${anio}`,
          dias: dias,
        };
      }else{
        obj_add = {
          anio: anio,
          dias: dias,
        };
      }

     
      this.tabla_datos.push(obj_add);
    } else {
      let filtro = this.dataSource.data.filter(
        (element) => element.dias == dias
      );
      let exist_anio = false;
      for (let index = 0; index < this.dataSource.data.length; index++) {
        if (this.dataSource.data[index].anio.toString().includes('-')) {
          let primero = this.dataSource.data[index].anio.split('-')[0];
          let ultimo = this.dataSource.data[index].anio.split('-')[1];
          for (let index2 = primero; index2 <= ultimo; index2++) {
            if (index2 == anio) {
              let dias = this.dataSource.data[index].dias;
              this.snackAlert(
                `El año ${
                  anio
                } ya está registrado con ${dias} ${dias > 1 ? 'días' : 'día'} `
              );
              exist_anio = true;
            }
          }
        } else {
          if (this.dataSource.data[index].anio == anio) {
            let dias = this.dataSource.data[index].dias;
            this.snackAlert(
              `El año ${
                anio
              } ya está registrado con ${dias} ${dias > 1 ? 'días' : 'día'} `
            );
            exist_anio = true;
          }
        }
      }
      
      if (!exist_anio) {
        if (filtro.length > 0) {
          if (filtro[0].anio.toString().includes('-')) {
            let datos_arr = filtro[0].anio.split('-');
            let primer_dato = datos_arr[0];
            let ultimo_dato = datos_arr.pop();
            
            if (
              !(
                primer_dato <= anio &&
                ultimo_dato >= anio
              )
            ) {              
              if (ultimo_dato <= anio) {
                let index = this.dataSource.data.findIndex(
                  (data) => data.dias == dias
                );
                obj_add = {
                  anio: `${primer_dato}-${anio}`,
                  dias: dias,
                };
                this.tabla_datos[index] = obj_add;
              } else {
                let index = this.dataSource.data.findIndex(
                  (data) => data.dias == dias
                );
                obj_add = {
                  anio: `${anio}-${ultimo_dato}`,
                  dias: dias,
                };
                this.tabla_datos[index] = obj_add;
              }
            }
          } else {
            if (filtro[0].anio != anio) {

              if (filtro[0].anio < anio) {
                let index = this.dataSource.data.findIndex(
                  (data) => data.dias == dias
                );
                obj_add = {
                  anio: `${filtro[0].anio}-${anio}`,
                  dias: dias,
                };
                this.tabla_datos[index] = obj_add;
              }else{
                let index = this.dataSource.data.findIndex(
                  (data) => data.dias == dias
                );
                obj_add = {
                  anio: `${anio}-${filtro[0].anio}`,
                  dias: dias,
                };
                this.tabla_datos[index] = obj_add;
              }
              
            }
          }
        } else {
          obj_add = {
            anio: anio,
            dias: dias,
          };
          this.tabla_datos.push(obj_add);
        }
      }
    }
    return this.tabla_datos;
  }

  public eliminarDatoTabla(data:any){
    if (data.anio.toString().includes("-")) {
      let primero:number = parseInt(data.anio.split("-")[0]);
      let ultimo:number = parseInt(data.anio.split("-")[1]);
      
      for (let index = primero; index <= ultimo; index++) {
        this.anios_vacaciones.push({anio: index});
      }      
    }else{
      this.anios_vacaciones.push({anio: data.anio});
    }
    
    this.anios_vacaciones.sort( (a,b) =>{
      return a.anio - b.anio;
    });

    let index = this.dataSource.data.findIndex(element => element.anio == data.anio);
    this.dataSource.data.splice(index, 1);
    this.dataSource.data = this.dataSource.data;
    

    /* let index = this.dataSource.data.findIndex(element => element.anio == data.anio);

    let dato_eliminado = this.dataSource.data.splice(index, 1);
    let reponer_anios = dato_eliminado[0].anio;
  
    
    if (reponer_anios.toString().includes("-")) {
      let inicial = reponer_anios.split("-")[0];
      let final = reponer_anios.split("-")[1];

      for (let index = inicial; index <= final; index++) {
        this.anios_vacaciones.push({anio: index})
      }
    }else{
      this.anios_vacaciones.push({anio: reponer_anios})
    }

    this.anios_vacaciones.sort( (a,b) =>{
      return a.anio - b.anio;
    });
    
    this.dataSource.data = this.dataSource.data; */
  }
  private snackAlert(mensaje: string) {
    this._snackBar.open(mensaje, 'Cerrar', {
      duration: 4000,
    });
  }

  ngOnInit(): void {}

  
  get nombre_politica() {
    return this.formGroup.get('nombre_politica');
  }
  get dias_descanso() {
    return this.formGroup.get('dias_descanso');
  }
  get earn_as_you_go() {
    return this.formGroup.get('earn_as_you_go');
  }
  get dias_vacaciones() {
    return this.formGroup.get('dias_vacaciones');
  }
  get data_anio() {
    return this.formGroupTable.get('data_anio');
  }
  get data_dias() {
    return this.formGroupTable.get('data_dias');
  }
}
