// Angular Core
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { AbstractControl, FormGroup, FormGroupDirective } from '@angular/forms';

// Interfaces
import { SuppliersMainSettingsInterface } from 'src/app/interfaces/supplier/suppliers-main-settings-interface';
import { UpdateSupplierDataInterface, ValidateAlphaNumSpecialInterface, ValidateNumericDataInterface, ValidateSpecialcharactersDataInterface } from 'src/app/interfaces/supplier/bulk-upload-settings';

@Component({
  standalone: false,
  selector: 'app-bulk-upload-settings',
  templateUrl: './bulk-upload-settings.component.html',
  styleUrls: ['./bulk-upload-settings.component.scss']
})
export class BulkUploadSettingsComponent implements OnInit {

  @Input() supplierData!:SuppliersMainSettingsInterface['data']['supplierData'];
  @Input() formGroupName!:string;

  @Output() validateAlphaNumSpecial = new EventEmitter<ValidateAlphaNumSpecialInterface>();
  @Output() updateSupplierData = new EventEmitter<UpdateSupplierDataInterface>();
  @Output() validateNumeric = new EventEmitter();
  @Output() validateSpecialcharacters = new EventEmitter();

  bulkUploadSettingsForm!: FormGroup;

  constructor(
    private rootForm:FormGroupDirective,
  ) { }

  ngOnInit(): void {
    this.bulkUploadSettingsForm = this.rootForm.control.get(this.formGroupName) as FormGroup;

    this.bulkUploadSettingsFormUpdate();
  }

  get bulkUploadSettingsFormData() { return this.bulkUploadSettingsForm.controls; }

  bulkUploadSettingsFormUpdate(){
    setTimeout(() => {
    this.bulkUploadSettingsForm.patchValue({
      import_field_count: this.supplierData.import_field_count,
      import_row_size: this.supplierData.import_row_size,
      import_delimiter: this.supplierData.import_delimiter,
      import_enclosure: this.supplierData.import_enclosure,
      import_skip_rows: this.supplierData.import_skip_rows,
      rebate_field: this.supplierData.rebate_field,
      import_heading_map: this.supplierData.import_heading_map,
    })}, 2000);
  }

  /**
   * Function to emit validateAlphaNumSpecial Data to listen that emitter into the parent component
   * @param {string } db_name
   * @param {boolean} status
   * @param {string} field
   */
  callvalidateAlphaNumSpecialFunc(db_name:AbstractControl, status:boolean){
    const validateAlphaNumSpecialDataToEmit: ValidateAlphaNumSpecialInterface = {
      db_name : db_name,
      status : status
    }
    this.validateAlphaNumSpecial.emit(validateAlphaNumSpecialDataToEmit);
  }

  /**
   * Function to emit updateSupplier Data to listen that emitter into the parent component
   * @param {string |number | null | boolean} supplierData
   * @param {string} settingsElementName
   */
  callUpdateSupplierDataFunc(supplierData:string | number | null | boolean, settingsElementName:string){
    Object.keys(this.bulkUploadSettingsForm.controls).forEach(controlName => {
        this.supplierData[controlName] = this.bulkUploadSettingsForm.controls[controlName].value;
    });
    supplierData = this.bulkUploadSettingsForm.get(settingsElementName)?.value;
    const updateSupplierDataToEmit: UpdateSupplierDataInterface = {
      supplierData : supplierData,
      settingsElementName : settingsElementName
    }
    this.updateSupplierData.emit(updateSupplierDataToEmit);
  }

  /**
   * Function to emit validateNumeric Data to listen that emitter into the parent component
   * @param {AbstractControl} supplierData
   * @param {boolean} status
   */
  callvalidateNumericFunc(supplierData:AbstractControl, status: boolean){
    const validateNumericDataToEmit: ValidateNumericDataInterface = {
      supplierData : supplierData,
      status :status
    }
    this.validateNumeric.emit(validateNumericDataToEmit);
  }

  /**
   * Function to emit validateSpecialcharacters Data to listen that emitter into the parent component
   * @param {AbstractControl} supplierData
   * @param {boolean} status
   */
  callvalidateSpecialcharactersFunc(supplierData:AbstractControl, status: boolean){
    const validateSpecialcharactersDataToEmit: ValidateSpecialcharactersDataInterface = {
      supplierData : supplierData,
      status : status
    }
    this.validateSpecialcharacters.emit(validateSpecialcharactersDataToEmit);
  }
}
