import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { UserResponse, UsersResponse } from '../../../../interfaces/users.interface';
import { lastValueFrom, map, Observable, startWith } from 'rxjs';
import { ResourcesService } from '../../../../services/resources.service';
import { InternationalizationService } from '../../../../services/internationalization/internationalization.service';
import { MatDialogRef } from '@angular/material/dialog';
import { FilterNotificate, RequestNotificate, ResponseDataFilterNotificate } from '../../../../interfaces/process-managementv/workflow-management.interface';
import { UsersProfilesService } from '../../../../services/users-profiles.service';
import { ProcessManagementService } from '../../../../services/process-management/process-management.service';
import { HttpErrorResponse } from '@angular/common/http';

@Component({
    selector: 'app-search-notificate',
    templateUrl: './search-notificate.component.html',
    styleUrl: './search-notificate.component.css',
    standalone: false
})
export class SearchNotificateComponent implements OnInit {
  public formGroup: FormGroup;
  public isLoading: boolean;

  public arrUsers: UserResponse[];
  public arrUsersStr: string[];
  public filteredOptionsUser!: Observable<string[]>;
  
  constructor(
    public resourcesService: ResourcesService,
    public interService: InternationalizationService,
    private _dialogReg: MatDialogRef<false | FilterNotificate[]>,
    private _usersProfilesService: UsersProfilesService,
    private _processManagementService: ProcessManagementService,
  ) {
    this.formGroup = this._createFormGroup();
    this.isLoading = false;

    this.arrUsers = [];
    this.arrUsersStr = [];
  }

  private _createFormGroup(): FormGroup {
    return new FormGroup({
      NUMERO_NOTIFICACION: new FormControl(null, Validators.min(1)),
      USUARIO_NOTIFICADO: new FormControl(null),
      TIPO_NOTIFICACION: new FormControl(null),
      ESTADO_NOTIFICACION: new FormControl(null),
      FECHA_INICIO: new FormControl<Date | null>(null),
      FECHA_FINAL: new FormControl<Date | null>(null),
    });
  }
  
  async ngOnInit() {
    this.isLoading = true;
    await this._getUsers();
    this.isLoading = false;

    this.filteredOptionsUser = this.formGroup.controls['USUARIO_NOTIFICADO'].valueChanges.pipe(
      startWith(''),
      map( value => {
        value = value === null || value === undefined ? '' : value;
        const filterValue = value.toLowerCase();
        return this.arrUsersStr.filter(option => option.toLowerCase().includes(filterValue));
      })
    )
  }

  private async _getUsers() {
    const user: string = this.resourcesService.getUser();
    const line: number = this.resourcesService.getLineNumber();
    await lastValueFrom(this._usersProfilesService.getUsers(user, line)).then(
      (responseData: UsersResponse) => {
        if (!responseData.error) {
          this.arrUsers = responseData.response;
          this.arrUsersStr = responseData.response.map((userResponse: UserResponse) => 
            `${userResponse.NOMBRE} ${userResponse.APEPAT}${userResponse.APEMAT === null || userResponse.APEMAT === undefined || userResponse.APEMAT === '' ? '' : ` ${userResponse.APEMAT}` } (${userResponse.IDUSUARIO})`);
        } else {
          this.resourcesService.openSnackBar(`${responseData.msg}`);
        }
      }, async (httpErrorResponse: HttpErrorResponse) => {
        let response = this.resourcesService.checkErrors(httpErrorResponse)
        if (response !== null && response.reload) {
          await this._getUsers();
        }
      }
    );
  }

  public async search() {
    let numeroNotificacion = this.formGroup.controls['NUMERO_NOTIFICACION'].value;
    if (numeroNotificacion !== null && numeroNotificacion !== undefined && numeroNotificacion !== '') {
      numeroNotificacion = parseInt(numeroNotificacion);
      if ( numeroNotificacion <= 0 ) {
        this.resourcesService.openSnackBar(`Ocurrió un error con el formato del número de notificación.`);
        return;
      }
      if (numeroNotificacion % 1 !== 0) {
        this.resourcesService.openSnackBar(`El número de notificación debe ser un número entero.`);
        return;
      }
    } else {
      numeroNotificacion = null;
    }

    let usuarioNotificado = this.formGroup.controls['USUARIO_NOTIFICADO'].value;
    if (usuarioNotificado !== null && usuarioNotificado !== undefined && usuarioNotificado !== '') {
      usuarioNotificado = usuarioNotificado.toString().trim();
      if ( !usuarioNotificado.includes('(') || !usuarioNotificado.includes(')') ) {
        this.resourcesService.openSnackBar(`Debe elegir una opción de la lista desplegable en el campo del usuario notificado.`);
        return;
      }
      usuarioNotificado = usuarioNotificado.split('(')[1].split(')')[0];
    } else {
      usuarioNotificado = null;
    }

    let tipoNotificacion = this.formGroup.controls['TIPO_NOTIFICACION'].value;
    if (tipoNotificacion !== null && tipoNotificacion !== undefined && tipoNotificacion !== '') {
      tipoNotificacion = tipoNotificacion.toString().trim();
    } else {
      tipoNotificacion = null;
    }

    let estadoNotificacion = this.formGroup.controls['ESTADO_NOTIFICACION'].value;
    if (estadoNotificacion !== null && estadoNotificacion !== undefined && estadoNotificacion !== '') {
      estadoNotificacion = estadoNotificacion.toString().trim();
    } else {
      estadoNotificacion = null;
    }

    let fechaInicio = this.formGroup.controls['FECHA_INICIO'].value;
    let fechaFinal = this.formGroup.controls['FECHA_FINAL'].value;

    if (fechaInicio !== null && fechaInicio !== undefined && fechaInicio !== '') {
      fechaInicio = new Date(fechaInicio);
      fechaInicio = this.resourcesService.getDateFormatCalendar(fechaInicio);
    } else {
      fechaInicio = null;
    }

    if (fechaFinal !== null && fechaFinal !== undefined && fechaFinal !== '') {
      fechaFinal = new Date(fechaFinal);
      fechaFinal = this.resourcesService.getDateFormatCalendar(fechaFinal);
    } else {
      fechaFinal = null;
    }

    if (fechaInicio !== null && fechaFinal === null) {
      this.resourcesService.openSnackBar(`Ocurrió un error al obtener el rango de fechas.`);
      return;
    }
    if (fechaInicio === null && fechaFinal !== null) {
      this.resourcesService.openSnackBar(`Ocurrió un error al obtener el rango de fechas.`);
      return;
    }

    const REQUEST_NOTIFICATE: RequestNotificate = {
      'NUMERO_NOTIFICACION': numeroNotificacion,
      'USUARIO_NOTIFICACION': usuarioNotificado,
      'TIPO_NOTIFICACION': tipoNotificacion,
      'ESTADO_NOTIFICACION': estadoNotificacion,
      'FECHA_INICIO': fechaInicio,
      'FECHA_FINAL': fechaFinal,
      'USUARIO': this.resourcesService.getUser(),
      'NUMERO_LINEA': this.resourcesService.getLineNumber(),
    }    
    
    await lastValueFrom(this._processManagementService.searchNotificate(REQUEST_NOTIFICATE)).then(
      (responseData: ResponseDataFilterNotificate) => {
        if (!responseData.error) {
          this._dialogReg.close(responseData.response);
        } else {
          this.resourcesService.openSnackBar(`${responseData.msg}`);
        }
      }, async (httpErrorResponse: HttpErrorResponse) => {
        let response = this.resourcesService.checkErrors(httpErrorResponse)
        if (response !== null && response.reload) {
          await this.search();
        }
      }
    );
  }
}
