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 { MESMSVService } from 'src/app/services/mes/mesmsv/mesmsv.service';
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 'moment/locale/es';
import { AlertaComponent } from '../../resources/dialogos/alerta/alerta.component';
import { USERInterface } from 'src/app/interfaces/user-interface';
import { ThisReceiver } from '@angular/compiler';
import { threadId } from 'worker_threads';
import { throws } from 'assert';
import { ENCService } from 'src/app/services/enc/enc.service';
import { MCOMDFService } from 'src/app/services/mco/mcomdf/mcomdf.service';
import { MCOMPVService } from 'src/app/services/mco/mcompv/mcompv.service';
import { MCOMDFInterface } from 'src/app/interfaces/mco/mcomdf/mcomdf-interface';

@Component({
  selector: 'app-mesmsv',
  templateUrl: './mesmsv.component.html',
  styleUrls: ['./mesmsv.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 MESMSVComponent implements OnInit {
  formGroup: FormGroup;
  dias: number = 0;
  fechaActual = new Date();
  envioForm: any = {
    text: 'Enviar',
    status: false,
  };
  minDate = new Date();
  todayDate = new Date();
  dias_feriados: any[] = null!;
  politica: string = null!;
  usuario_session: USERInterface = JSON.parse(
    localStorage.getItem('TIMUSERENC')!
  );

  diasFeriados: any[] = [
    { dia: 5, mes: 1, periodo: 2022 },
    { dia: 10, mes: 1, periodo: 2022 },
    { dia: 15, mes: 1, periodo: 2022 },
    { dia: 20, mes: 1, periodo: 2022 },
    { dia: 25, mes: 1, periodo: 2022 },
  ];
  error_politica: boolean = false;

  constructor(
    private _encService: ENCService,
    public dialog: MatDialog,
    private _mcomdfService: MCOMDFService,
    private _mcompvService: MCOMPVService,
    private _snackBar: MatSnackBar,
    private _mesmsv: MESMSVService
  ) {
    this.formGroup = this.createFormGroup();
  }

  ngOnInit(): void {
    this.obtenerDiasFeriados();
  }

  private createFormGroup() {
    return new FormGroup({
      numero_empleado: new FormControl({
        value: this._encService.desencriptar(this.usuario_session.IDUSUARIO),
        disabled: true,
      }),
      fecha_inicio: new FormControl(
        { value: '', disabled: false },
        Validators.required
      ),
      fecha_fin: new FormControl(
        { value: '', disabled: false },
        Validators.required
      ),
      dias_vacacionales: new FormControl({ value: '', disabled: false }),
    });
  }

  registrar() {
    this.envioForm.text = 'Enviando...';
    this.envioForm.status = true;
    let insertar = {
      rfc_empresa: this.usuario_session.RFCEMPRESA,
      numero_empleado: this._encService.desencriptar(
        this.usuario_session.IDUSUARIO
      ),
      fecha_inicio: this.formatDate(this.fecha_inicio?.value),
      fecha_final: this.formatDate(this.fecha_fin?.value),
      numero_dias: this.dias_vacacionales?.value,
    };

    this._mesmsv.crear(insertar).subscribe(
      (data) => {
        if (!data.error) {
          this.snackAlert('¡Solicitud enviada!');
        } else {
          this.snackAlert(data.msg);
        }
        this.envioForm.text = 'Enviar';
        this.envioForm.status = 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');
        }
        this.envioForm.text = 'Enviar';
        this.envioForm.status = false;
      }
    );
  }

  openDialog() {
    let dataAction = {
      titulo: 'Confirmación',
      descripcion: '¿Está seguro de registrar la solicitud?',
    };

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

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

  calcular_dias() {
    let dias_semana: any = [];
    if (this.politica != null) {
      dias_semana = Object.values(JSON.parse(this.politica));
    }

    let cont = 0;
    if (this.fecha_fin?.value != null) {
      if (
        (this.fecha_inicio?.value._d != undefined &&
          this.fecha_fin?.value._d != undefined) ||
        (this.fecha_inicio?.value._d != null &&
          this.fecha_fin?.value._d != null)
      ) {
        let fecha1: Date = this.fecha_inicio?.value._d;
        let fecha2: Date = this.fecha_fin?.value._d;

        this.dias = this.difference(fecha1, fecha2) + 1;

        for (let index = 0; index < this.dias; index++) {
          let dia_semana_recorrida = fecha1.getDay();

          if (dias_semana[0] != 'Si' && dia_semana_recorrida == 0) {
            cont++;
          }

          if (dias_semana[1] != 'Si' && dia_semana_recorrida == 4) {
            cont++;
          }

          if (dias_semana[2] != 'Si' && dia_semana_recorrida == 1) {
            cont++;
          }

          if (dias_semana[3] != 'Si' && dia_semana_recorrida == 2) {
            cont++;
          }

          if (dias_semana[4] != 'Si' && dia_semana_recorrida == 3) {
            cont++;
          }

          if (dias_semana[5] != 'Si' && dia_semana_recorrida == 6) {
            cont++;
          }

          if (dias_semana[6] != 'Si' && dia_semana_recorrida == 5) {
            cont++;
          }

          if (dia_semana_recorrida) {
          }

          this.dias_feriados.forEach((element) => {
            if (
              element.DIA == fecha1.getDate() &&
              element.MES - 1 == fecha1.getMonth()
            ) {
              if (dia_semana_recorrida == 6 || dia_semana_recorrida == 0) {
              } else {
                cont--;
              }
            }
          });

          fecha1 = new Date(
            fecha1.getFullYear(),
            fecha1.getMonth(),
            fecha1.getDate() + 1
          );
        }
        this.dias_vacacionales?.setValue(cont);

        return cont;
      }
      return 0;
    }
    return 0;
  }

  applyFilter(e: any) {
    let dias_semana = Object.values(JSON.parse(this.politica));
    let diasVacaciones = parseInt(e.target.value);
    let cont = 0;
    let diasFeriados = 0;
    let fecha1: Date = this.fecha_inicio?.value._d;

    do {
      this.dias_feriados.forEach((element) => {
        if (
          element.DIA == fecha1.getDate() &&
          element.MES - 1 == fecha1.getMonth()
        ) {
          if (dias_semana[0] != 'Si' && fecha1.getDay() == 0) {
            diasFeriados++;
          }

          if (dias_semana[1] != 'Si' && fecha1.getDay() == 4) {
            diasFeriados++;
          }

          if (dias_semana[2] != 'Si' && fecha1.getDay() == 1) {
            diasFeriados++;
          }

          if (dias_semana[3] != 'Si' && fecha1.getDay() == 2) {
            diasFeriados++;
          }

          if (dias_semana[4] != 'Si' && fecha1.getDay() == 3) {
            diasFeriados++;
          }

          if (dias_semana[5] != 'Si' && fecha1.getDay() == 6) {
            diasFeriados++;
          }

          if (dias_semana[6] != 'Si' && fecha1.getDay() == 5) {
            diasFeriados++;
          }
        }
      });

      if (dias_semana[0] == 'Si' && fecha1.getDay() == 0) {
        diasFeriados++;
      }

      if (dias_semana[1] == 'Si' && fecha1.getDay() == 4) {
        diasFeriados++;
      }

      if (dias_semana[2] == 'Si' && fecha1.getDay() == 1) {
        diasFeriados++;
      }

      if (dias_semana[3] == 'Si' && fecha1.getDay() == 2) {
        diasFeriados++;
      }

      if (dias_semana[4] == 'Si' && fecha1.getDay() == 3) {
        diasFeriados++;
      }

      if (dias_semana[5] == 'Si' && fecha1.getDay() == 6) {
        diasFeriados++;
      }

      if (dias_semana[6] == 'Si' && fecha1.getDay() == 5) {
        diasFeriados++;
      }

      /*  if (fecha1.getDay() == 6) {
        diasFeriados++;

        if (cont + 1 == diasVacaciones) {
          diasFeriados++;
        }
      }

      if (fecha1.getDay() == 0) {
        diasFeriados++;
      } */

      if (cont + 1 == diasVacaciones) {
        fecha1 = new Date(
          fecha1.getFullYear(),
          fecha1.getMonth(),
          fecha1.getDate() + diasFeriados
        );
      } else {
        if (diasFeriados > 0) {
          fecha1 = new Date(
            fecha1.getFullYear(),
            fecha1.getMonth(),
            fecha1.getDate() + diasFeriados
          );
        } else {
          fecha1 = new Date(
            fecha1.getFullYear(),
            fecha1.getMonth(),
            fecha1.getDate() + 1
          );
        }
      }

      if (diasFeriados == 0) {
        cont++;
      }

      diasFeriados = 0;
    } while (cont < diasVacaciones);

    this.fecha_fin?.setValue(fecha1);
  }

  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 obtenerDiasFeriados() {
    this._mcomdfService.obtener().subscribe(
      (response) => {
        this.dias_feriados = response.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');
        }
      }
    );

    this._mcompvService.obtenerPolitica().subscribe(
      (response) => {
        this.politica = response.response.DIASDESCANSO;
      },
      (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');
        }
      }
    );
  }

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

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

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

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

  private difference(date1: Date, date2: Date) {
    const date1utc = Date.UTC(
      date1.getFullYear(),
      date1.getMonth(),
      date1.getDate()
    );
    const date2utc = Date.UTC(
      date2.getFullYear(),
      date2.getMonth(),
      date2.getDate()
    );
    let day = 1000 * 60 * 60 * 24;
    return (date2utc - date1utc) / day;
  }

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