// Angular Core
import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';

// RxJs
import { Subscription, catchError, throwError } from 'rxjs';

// Pipes
import { StripDashPipe } from 'src/app/filters/strip-dash.pipe';

// Services
import { SearchService } from 'src/app/services/search/search.service';

// Interfaces
import { resultInterface, searchRenderInterface } from 'src/app/interfaces/common-interfaces';

@Component({
  standalone: false,
  selector: 'app-product-request-form',
  templateUrl: './product-request-form.component.html',
  styleUrls: ['./product-request-form.component.scss']
})
export class ProductRequestFormComponent implements OnInit, OnDestroy {

  @Input() data!: searchRenderInterface['elsevierProductData'];
  @Input() searchTerm!: string;

  sentRequest: boolean = false;
  requestForm: any = new FormGroup({});

  constructor(
    private stripDash: StripDashPipe,
    private searchService: SearchService,
    private formBuilder: FormBuilder,
  ) { }

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

  createRequestProductForm(request: resultInterface) {
    this.requestForm = this.formBuilder.group({
      product_trade_name: ['' , Validators.required],
      strength: ['', Validators.required],
      dosage_form: ['', Validators.required],
      package_size: ['' , Validators.required],
      ndc_code542: ['' , Validators.required],
      qty: ['' , Validators.required],
      fromPrice: ['' , Validators.required],
      toPrice: ['' , Validators.required],
    });

    this.setFormValue(request);
  }

  setFormValue(request: resultInterface){
    this.requestForm.patchValue({
      product_trade_name: request?.product_trade_name ,
      strength: request?.strength,
      dosage_form: request?.dosage_form,
      package_size: request?.package_size,
      ndc_code542: request?.ndc_code542,
      qty: request?.qty,
      fromPrice: request?.fromPrice,
      toPrice: request?.toPrice,
    });
  }

  /**
   * Submit the product request
   * @param {object} result
   * @returns {undefined}
   */
  requestProductSubscribe!: Subscription;
  submitProductRequest(result: FormGroup) {
    if(result.valid){
      this.requestProductSubscribe = this.searchService.requestProduct(result.value)
        .pipe(
          catchError((err) => {
            return throwError(() => err);
          })
        )
        .subscribe({
          next: (res: any) => {
            this.sentRequest = true;
          },
          error: (err: HttpErrorResponse) => {
            this.searchService.errorCallBack(err)
          },
          complete: () => { }
        })
    }
  };

  initialProcess(){
    this.createRequestProductForm(this.data);
    var searchInput = this.stripDash.transform(this.searchTerm);
    const pattern = /^\d+$/;

    if (pattern.test(searchInput)) {
      this.requestForm.get('ndc_code542').setValue(searchInput);
    } else {
      this.requestForm.get('product_trade_name').setValue(this.searchTerm);
    }
  }

  /**
   * Update the form data listener
   */
  // updateFormListener = $rootScope.$on('updateFormData', function (event, data) {
  //   $scope.data = data;
  //   this.initialProcess();
  // });

  ngOnDestroy(): void {
    this.requestProductSubscribe?.unsubscribe();
  }

}
