import { Component, AfterViewInit, ViewChild } from '@angular/core';
import { MatPaginator } from '@angular/material/paginator';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatTableDataSource } from '@angular/material/table';
import * as moment from 'moment';
import { MCOMBAInterface } from 'src/app/interfaces/mco/mcomba/mcomba-interface';
import { IAMService } from 'src/app/services/iam/iam.service';
import { MCOMBAService } from 'src/app/services/mco/mcomba/mcomba.service';

@Component({
  selector: 'app-mcomba',
  templateUrl: './mcomba.component.html',
  styleUrls: ['./mcomba.component.css'],
})
export class MCOMBAComponent implements AfterViewInit {
  loading: Boolean = true;
  data_empty = false;
  displayedColumns: string[] = [
    'IDBITACORA',
    'IDUSUARIO',
    'NOMBRE',
    'EMAIL',
    'FECHAACCESO',
    'IPACCESO',
  ];

  dataSource = new MatTableDataSource<MCOMBAInterface>([]);
  obtenerNumeroRegistroBitacora: number = 0;
  selectValue: any;
  selectFilter = [10, 50, 100];
  pagina1: number = 0;
  pagina2: number = 10;

  pagSiguiente: boolean = false;
  pagAnterior: boolean = true;

  constructor(
    private _mcombaService: MCOMBAService,
    private _snackBar: MatSnackBar,
    private _iamService: IAMService
  ) {
    this.selectValue = this.selectFilter[0];
    this.obtenerNumeroRegistro();
    this.paginaInicial();
  }

  ngAfterViewInit() {
    this.dataSource.filterPredicate = function (data, filter: string): boolean {
      var d = new Date(data.FECHAACCESO),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

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

      let fecha = [year, month, day].join('-');
      if (data.FECHAACCESO != null) {
        let horaString = data.FECHAACCESO.toLocaleString('es-CA');
        let horaArreglo = horaString.split(' ');
        fecha = fecha + ' ' + horaArreglo[1];
      }

      return (
        data.IDUSUARIO.toString().toLowerCase().includes(filter) ||
        data.NOMBRE.toString().toLowerCase().includes(filter) ||
        data.EMAIL.toString().toLowerCase().includes(filter) ||
        fecha.toString().toLowerCase().includes(filter) ||
        data.IPACCESO.toString().toLowerCase().includes(filter)
      );
    };
  }

  @ViewChild(MatPaginator) paginator!: MatPaginator;

  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('-');
  }

  paginaSiguiente() {
    this.pagAnterior = false;

    this.pagina1 = this.pagina2 + 1;
    this.pagina2 += this.selectValue;

    if (this.pagina2 >= this.obtenerNumeroRegistroBitacora) {
      this.pagina2 = this.obtenerNumeroRegistroBitacora;
      this.pagSiguiente = true;
    }

    this._mcombaService
      .obtenerPorPagina(this.pagina1 - 1, this.selectValue)
      .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;
            
          } 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');
          }
        }
      );
  }

  paginaAnterior() {
    this.pagina2 = this.pagina1 - 1;
    this.pagSiguiente = false;
    this.pagina1 -= this.selectValue;

    if (this.pagina1 <= 1) {
      this.pagina2 = this.selectValue;
      this.pagAnterior = true;
    }

    this._mcombaService
      .obtenerPorPagina(this.pagina1 - 1, this.selectValue)
      .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;
          } 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');
          }
        }
      );
  }

  primeraPagina() {
    this.pagina1 = 1;
    this.pagina2 = this.selectValue;
    this.pagAnterior = true;
    this.pagSiguiente = false;

    this._mcombaService.obtenerPorPagina(0, this.selectValue).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;
        } 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');
        }
      }
    );
  }

  ultimaPagina() {
    this.pagAnterior = false;
    this.pagSiguiente = true;

    let ultimaPaginaAux =
      Math.ceil(this.obtenerNumeroRegistroBitacora / this.selectValue) - 1;
    let ultimaPagina = ultimaPaginaAux * this.selectValue + 1;

    this.pagina1 = ultimaPagina;
    this.pagina2 = this.obtenerNumeroRegistroBitacora;

    this._mcombaService
      .obtenerPorPagina(this.pagina1, this.selectValue)
      .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;
          } 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');
          }
        }
      );
  }

  onSelectionChange() {
    this.pagAnterior = true;
    this.pagSiguiente = false;

    this.pagina1 = 1;
    this.pagina2 = this.selectValue;
    
    this._mcombaService.obtenerPorPagina(0, this.selectValue).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;
          
          if (this.selectValue == 100 && res.response.length < 100) {
            this.pagSiguiente = true;
            this.pagina2 = res.response.length;
          }
        } 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');
        }
      }
    );
  }

  paginaInicial() {
    this._mcombaService.obtenerPorPagina(this.pagina1, this.pagina2).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;
        } 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');
        }
      }
    );
    this.pagina1 += 1;
  }

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

  obtenerNumeroRegistro() {
    this._mcombaService.obtenerNumeroRegistro().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) {
          this.obtenerNumeroRegistroBitacora = res.response.NUMEROREGISTROS;
        } else {
          this.snackAlert(
            res.response.length > 0 ? res.msg : 'No hay datos para mostrar'
          );
        }
      },
      (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');
        }
      }
    );
  }

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