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

// Services
import { UtilitiesService } from 'src/app/services/utilities/utilities.service';

// Interfaces
import { CntrlRatioConfig, cntrlRatioInfoInterface } from 'src/app/interfaces/common-interfaces';

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

  @Input() cntrlRatioInfo!:cntrlRatioInfoInterface;
  @Input() cntrlRatioConfig!:CntrlRatioConfig;
  @Input() formGroupName!:string;

  @Output() validateRatioValues = new EventEmitter<object>();
  @Output() validateControlsStatement = new EventEmitter<object>();

  constructor(
    private utilities: UtilitiesService,
  ) { }

  ngOnInit(): void {
    setTimeout(() => {
      this.setRatioSettings();
      this.disableDrpDwnBasedOnRatio();
      this.clearControlsStatement();
      this.disableRatioTextBoxes();
    }, 2000);
  }

  /**
  * Method introduced as part of TRX-8030
  * Disables custom units dropdown if select other than 'custom ratio' option
  *
  * @returns void
  */
  disableDrpDwnBasedOnRatio() {
    if (this.cntrlRatioConfig.ratioArray.indexOf(this.cntrlRatioInfo.ratio_settings) !== -1) {
        this.cntrlRatioConfig.disableDropDown = true;
    } else {
        this.cntrlRatioConfig.disableDropDown = false;
    }
  };

  /**
  * Method introduced as part of TRX-8030
  * Disables other text boxes except selected option
  * 
  * @returns void
  */
  disableRatioTextBoxes() {
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.unitRatio) {
        this.cntrlRatioConfig.disableValueTxtBx = true;
        this.cntrlRatioConfig.disableUnitTxtBx = false;

        //Remove Validation error border
        this.cntrlRatioConfig.isAmountRatioTxtBxNotValid = false;

        this.clearRatioTextBoxValues(this.cntrlRatioConfig.unitRatio);
    }
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.amountRatio) {
        this.cntrlRatioConfig.disableUnitTxtBx = true;
        this.cntrlRatioConfig.disableValueTxtBx = false;

        //Remove Validation error border
        this.cntrlRatioConfig.isUnitRatioTxtBxNotValid = false;

        this.clearRatioTextBoxValues(this.cntrlRatioConfig.amountRatio);
    }
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.noRatio) {
        this.cntrlRatioConfig.disableUnitTxtBx = true;
        this.cntrlRatioConfig.disableValueTxtBx = true;

        //Remove Validation error border
        this.cntrlRatioConfig.isUnitRatioTxtBxNotValid = false;
        this.cntrlRatioConfig.isAmountRatioTxtBxNotValid = false;

        this.clearRatioTextBoxValues(this.cntrlRatioConfig.noRatio);
    }
  };

  /**
  * Method introduced as part of TRX-8030
  * Clear text box values based on ration setting option selection
  * 
  * @returns void
  */
  clearRatioTextBoxValues (ratioType:string) {
    if (ratioType === this.cntrlRatioConfig.unitRatio) {
        //Clearing values for disabled ratio textboxes
        this.cntrlRatioInfo.ratio_value_numerator = 0;
        this.cntrlRatioInfo.ratio_value_denominator = 0;
    }
    if (ratioType === this.cntrlRatioConfig.amountRatio) {
        //Clearing values for disabled ratio textboxes
        this.cntrlRatioInfo.ratio_unit_numerator = 0;
        this.cntrlRatioInfo.ratio_unit_denominator = 0;
    }
    if (ratioType === this.cntrlRatioConfig.noRatio) {
        //Clearing values for disabled ratio textboxes
        this.cntrlRatioInfo.ratio_value_numerator = 0;
        this.cntrlRatioInfo.ratio_value_denominator = 0;
        this.cntrlRatioInfo.ratio_unit_numerator = 0;
        this.cntrlRatioInfo.ratio_unit_denominator = 0;
    }
  };

  /**
  * Method introduced as part of TRX-8030
  * Clear Control Statement value if checkbox is disabled
  * 
  * @returns void
  */
  clearControlsStatement() {
    if (this.cntrlRatioInfo.controls_statement_enabled === false) {
        this.cntrlRatioInfo.controls_statement = '';
        this.cntrlRatioConfig.disableCntrlStmt = true;
        this.cntrlRatioConfig.isControlStmtNotValid = false;
    } else {
        this.cntrlRatioConfig.disableCntrlStmt = false;
    }
  };

  /**
  * Method introduced as part of TRX-8030
  * Sets default values for Ratio text boxes
  * 
  * @returns void
  */
  setRatioSettings() {
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.amountRatio) {
        this.clearRatioTextBoxValues(this.cntrlRatioConfig.amountRatio);
    }
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.unitRatio) {
        this.clearRatioTextBoxValues(this.cntrlRatioConfig.unitRatio);
    }
    if (this.cntrlRatioInfo.ratio_settings === this.cntrlRatioConfig.noRatio) {
        this.clearRatioTextBoxValues(this.cntrlRatioConfig.noRatio);
    }
  };

  /**
   * Function to emit the validateRatioValues data to listen into the parent component
   */
  callvalidateRatioValuesFunc(){
    this.validateRatioValues.emit({});
  }

  /**
   * Function to emit the validateControlsStatement data to listen into the parent component
   */
  callvalidateControlsStatementFunc(){
    this.validateControlsStatement.emit({});
  }

    onRatioSettingsChange(value: string) {
      this.cntrlRatioInfo.ratio_settings = value;
      this.disableDrpDwnBasedOnRatio();
      this.disableRatioTextBoxes();
    }

    onRatioUnitNumeratorInput(event: any) {
      this.cntrlRatioInfo.ratio_unit_numerator = event.target.value;
    }

    onRatioUnitDenominatorInput(event: any) {
      this.cntrlRatioInfo.ratio_unit_denominator = event.target.value;
    }

    onRatioValueNumeratorInput(event: any) {
      this.cntrlRatioInfo.ratio_value_numerator = event.target.value;
    }

    onRatioValueDenominatorInput(event: any) {
      this.cntrlRatioInfo.ratio_value_denominator = event.target.value;
    }

    onControlsStatementEnabledChange(event: any) {
      this.cntrlRatioInfo.controls_statement_enabled = event.target.checked;
      this.clearControlsStatement();
    }

    onControlsStatementInput(event: any) {
      this.cntrlRatioInfo.controls_statement = event.target.value;
    }

}
