// Angular Core
import { Injectable, EventEmitter } from '@angular/core';
import { HttpClient } from '@angular/common/http';

// Services
import { ApiService } from '../api/api.service';

@Injectable({
  providedIn: 'root'
})
export class AccountInfoService {

  constructor(private http: HttpClient, public api: ApiService) { }

  enableChangePasswordDiv = new EventEmitter();

  /**
   * Gets user account information
   * @returns {object} promise
   */
  getAccountInfo() {
    return this.api.read('/UserData');
  };

  /**
   * Gets states information
   * @returns {object} promise
   */
  getStates() {
    return this.api.read('/UserData/statesList');
  };

  /**
   * Gets suppliers information
   * @returns {object} promise
   */
  getSuppliers() {
    return this.api.read('/UserData/supplierList');
  };

  /**
   * Method to save user account information        
   * @returns {object} promise
   */
  saveAccountInfo(userAccountData: any, isPasswordChange: any, beforeSaveData: any, afterSaveData: any) {
    let accountData: any = {};
    accountData.data = userAccountData

    if (isPasswordChange) {
      accountData.change_password = 1;
    }

    if (beforeSaveData && afterSaveData) {
      accountData.beforeSaveData = beforeSaveData;
      accountData.afterSaveData = afterSaveData;
    };

    return this.api.create('/ManageAccount', accountData);
  };

  /**
   * Sends request to get PDF file content
   * @param {string} doc
   * @returns {object} promise
   */
  viewUniversalApp(doc: string) {
    var data = {
      document: doc
    };
    return this.api.create('/User-ManageSupplier', data);
  };

  /**
   * sends respose to api service for handling
   * @param {object} response object
   * @returns {undefined}
   */
  errorCallBack(response: {}) {
    this.api.errorCallback(response);
  };

  /**
   * Gets user's annual data
   * @returns {object} promise
   */
  getUserAnnualData() {
    return this.api.read('/User-AnnualData');
  };

  /**
   * Gets Pharmacy Management System information
   * @returns {object} promise
   */
  getPmsList() {
    return this.api.read('/UserData/pmsList');
  };

  /**
   * Update user's data
   * @param {type} data
   * @returns {object} promise
   */
  saveAnnualUpdateInfo(data: any) {
    let accountData: any = {};
    accountData = {
      xu_status_340B: data.status_340B,
      xu_buying_group: data.buying_group,
      xu_compounding_services: data.compounding_services,
      xu_delivery: data.delivery,
      xu_pharmacy_24_hour: data.pharmacy_24_hour,
      xu_health_services: data.health_services,
      xc_purchaser_firstname: data.purchaser_firstname,
      xc_purchaser_lastname: data.purchaser_lastname,
      xc_purchaser_phone: data.purchaser_phone,
      xc_purchaser_position: data.purchaser_position,
      xc_purchaser_email: data.purchaser_email,
      xc_accounting_email: data.accounting_email,
      xc_accounting_firstname: data.accounting_firstname,
      xc_accounting_lastname: data.accounting_lastname,
      xc_accounting_phone: data.accounting_phone,
      xc_accounting_position: data.accounting_position,
      xc_accounting_same_as_purchaser: data.accounting_same_as_purchaser,
      primary_supplier_id: data.primary_supplier_id,
      secondary_supplier_id: data.secondary_supplier_id,
      technology_company_name: data.technology_company_name,
      gpo_primary_buying_group_id: data.gpo_primary_buying_group_id,
      gpo_secondary_buying_group_id: data.gpo_secondary_buying_group_id
    };
    /*
     * As per TRX-7352, Reason behind assigning empty values
     * to primary/secondary_buying_group_name is to update buying group name
     * with empty value when user selects any value from Buying Group dropdown other than "Other" option.
    */
    accountData.gpo_primary_buying_group_name = '';
    accountData.gpo_secondary_buying_group_name = '';
    if (data.secondary_supplier_id === null || data.secondary_supplier_id === '') {
      accountData.secondary_supplier_id = 0;
    }

    if (data.primary_supplier_id === '999999' && data.primary_reference_name !== '') {
      accountData.primary_reference_name = data.primary_reference_name;
    }

    if (data.secondary_supplier_id === '999999' && data.secondary_reference_name !== '') {
      accountData.secondary_reference_name = data.secondary_reference_name;
    }

    if (data.gpo_primary_buying_group_id === null || data.gpo_primary_buying_group_id === '') {
      accountData.gpo_primary_buying_group_id = 0;
    }

    if (data.gpo_secondary_buying_group_id === null || data.gpo_secondary_buying_group_id === '') {
      accountData.gpo_secondary_buying_group_id = 0;
    }

    if (data.gpo_primary_buying_group_id === '999999' && data.gpo_primary_buying_group_name !== '') {
      accountData.gpo_primary_buying_group_name = data.gpo_primary_buying_group_name;
    }

    if (data.gpo_secondary_buying_group_id === '999999' && data.gpo_secondary_buying_group_name !== '') {
      accountData.gpo_secondary_buying_group_name = data.gpo_secondary_buying_group_name;
    }

    return this.api.create('/User-AnnualData', accountData);
  };

  /**
   * Request to Upload a document
   * @param {type} data
   * @returns {unresolved}
   */
  uploadDocument(data: any) {
    return this.api.upload('/UploadDocument', data);
  };

  /**
   * Update User's Registration data
   * @param {object} userInfo 
   * @returns {unresolved} 
   */
  saveUserInfo(userInfo:any) {
    return this.api.create('/UpdateUser', userInfo);
  };

  /**
   * Get Hellosign Document Url
   * @returns {unresolved} 
   */
  documentUrl() {
    return this.api.read('/ESign-HelloSignUrl');
  };

  /**
   * Update Document Key and Access Key
   * @param {object} data 
   * @returns {unresolved} 
   */
  applicationSigned(data: any) {
    return this.api.create('/ESign-ApplicationSigned', data);
  };

  /**
   * send hellosign email with signed copy.
   * @param {object} data 
   * @returns {unresolved} 
   */
  helloSignEmail(data: any) {
    return this.api.create('/ESign-ApplicationSigned/sendHelloSignEmail', data);
  };

  /**
   * Get Account status
   * @returns {unresolved} 
   */
  getAccountStatus() {
    return this.api.read('/ESign-ApplicationSigned');
  }

  /**
   * Update User's Controls Questionnaire
   * @param {object} userInfo 
   * @returns {unresolved} 
   */
  saveUserQuestionnaire(userQuestionnaire: any) {
    return this.api.create('/User-Questionnaire', userQuestionnaire);
  }

  /**
   * Get user Questionnaire information
   * @returns {object} promise
   */
  getQuestionnaire() {
    return this.api.read('/User-Questionnaire/getUserQuestionnaire');
  };

  /**
   * Request to reset esign
   * @param {type} isReset
   * @returns {unresolved}
   */
  resetForEsign(isReset: boolean) {
    var data = {
      'resetForEsign': isReset
    };
    return this.api.create('/UpdateUser/resetForEsign', data);
  };

  /**
   * Check if a user is autovalidated
   * @param {bool} payMethodAdded
   */
  isAutoValidated(payMethodAdded: boolean) {
      var payMethodExist = 0;
      if(payMethodAdded) {
          payMethodExist = 1;
      }
    return this.api.read('/UpdateUser/getIfAutoValidated?payMethodAdded=' + payMethodExist);
  };

  /**
  * updateNoOfRemainingTries
  * @param {type} isReset
  * @returns {unresolved}
  */
  updateNoOfRemainingTries(dismisses: any) {
    var data = {
      noOfTriesLeft: dismisses
    };
    return this.api.create('/User-AnnualData/updateAnnualDataUpdateTries', data);
  };

  /**
   * Update survey questionnaire
   * @param {string} action
   * @param {object} survey
   * @returns {unresolved}
   */
  userSurveyUpdate(action: string, survey: {}) {
    var data = {
      action: action,
      survey: survey
    };
    return this.api.create('/User-Survey', data);
  };

  /**
   * When a Buyer/Pharmacy visits "Tools/Auto Reshop" module
   * then unaccepted transaction count need to be reset.
   * This will be achieved using below end point
   * 
   * @returns {unresolved}
   */
  resetUnacceptedTransCount() {
    let data: any;
    return this.api.create('/User-ResetUnacceptedTransCount', data);
  }

  /**
   * Below method is introduced as part of TRX-7349
   * Gets Buying Group List
   * @returns {object} promise
  */
  buyingGroupList() {
    return this.api.read('/UserData/buyingGroupList');
  };

  /**
   * The below method decrease the count based on the close button clicked by pharmacy
   * @param {int} count
   * @returns {unresolved}
   */
  updateTaxExmptWrngCount(count: number) {
    var data = {
      noOfWarningCountLeft: count
    };
    return this.api.create('/UpdateUser/updateTaxExemptWarningCount', data);
  };

  /**
   * TRX-7716
   * Gets Tax Exempt details
   * @returns {object}
   */
  getTaxExemptDetails() {
    return this.api.read('/UserData/getTaxExemptDetails');
  };

  /**
   * Method introduced as part of TRX-8411
   * Gets User Agreement Document
   * @returns {object}
  */
  getUserAgreementDoc() {
    return this.api.read('/UserData/userAgreementDoc');
  };

  /**
   * Fetch primary and secondary owner positions.
   * @returns {unresolved}
   */
   getOwnerPositions() {
    return this.api.read('/UserData/getOwnerPositions');
  };

  /**
   * Fetch document flags to determine whether they are uploaded or not.
   * @returns {unresolved}
   */
  getDocumentFlags() {
    return this.api.read('/UploadDocument/documentFlags');
  };

  /**
   * Gets Captcha
   * @returns {object} promise
  */
  getCaptcha() {
    return this.api.read('/Session/getCaptcha');
  };

  /**
   * Save Primary Catalog Settings
   * @param {type} primaryCatalogData
   * @returns {unresolved}
  */
  savePrimaryCatalogSetts(primaryCatalogData: any) {
    return this.api.create('/ManageAccount', primaryCatalogData);
  };

  /**
   * Gets Primary Catalog Settings
   * @returns {object} promise
  */
  getPrimaryCatalogSetts() {
    return this.api.read('/ManageAccount');
  };
  
  saveQSQContactInfo(surveyData: any) {
    return this.api.create('/User-Survey', surveyData);
  }

  /**
   * Call access payment portal API.
   * @returns {object} promise
   */
  accessPaymentPortal() {
    return this.api.read('/ManageAccount/paymentPortal');
  };
  
  /**
   * @returns {unresolved}
   */
  createSetup() {
      let data: any;
      return this.api.create('/User-Payment/createSetupIntent', data);
  }
  
  /**
   * gets userPay methods exist
   * @returns {object} promise
   */
  hasPayMethods() {
    return this.api.read('/User-Payment/hasPayMethods');
  };

  /**
   * gets userPay methods
   * @returns {object} promise
  */
  getAllPaymentMethods() {
    return this.api.read('/User-Payment/getAllPaymentMethods');
  };
  
  /**
   * update payment method
   * @param updateData
   * @returns {object} promise
  */
  updatePaymentMethod(updateData: any) {
    return this.api.create('/User-Payment/updatePaymentMethod', updateData);
  };
  
  /**
   * delete payment method
   * @param paymentData
   * @returns {object} promise
  */
  deletePaymentMethod(paymentData: any) {
    return this.api.create('/User-Payment/deletePaymentMethod', paymentData);
  }
  
  
  /**
   * Save Payment Method Information
   * @param {string} payMethodId
   * @param {string} verifyURL
   * @returns {unresolved}
   */
  savePayMethodInfo(payMethodId: any, verifyURL: any) {
    var data = {
      paymentMethodId: payMethodId,
      verifyURL:verifyURL
    };
    return this.api.create('/User-Payment/savePayMethodInfo', data);
  };
  
  /**
   * backToReview method
   * @returns {object} promise
   */
  backToReview() {
     return this.api.create('/Cart-Checkout/backToReview', {});
   }
   
    /**
     * Tracks the event when a user click on add new to add payment method.
     * 
     * `/User-TrackEvent/addNewPayMethod` for event tracking.
     *
     * @returns {Observable<any>}
     */
    trackAddNewPayMethodEvent() {
        return this.api.create('/User-TrackEvent/addNewPayMethod', {});
    }
    
    /**
     * Deletes the saved payment method for a specific supplier from the user's cart.
     *
     * @param suppId
     * @returns An Observable representing the API response.
     */
    delCartUserSuppPayMethod(suppId: any) {
         return this.api.create('/Cart-UpdateCart/delUserSuppPayMethod', {supplierId:suppId});
    }
    
   /** Gets Stripe Payment Methods
    * @param Observable
    */
    getStripePayMethods() {
      return this.api.read('/User-Payment/getStripePayMethods');
    }
    
    /**
     * Gets Payments FAQs
     * @returns {object} promise
     */
    getPaymentsFaqs() {
        return this.api.read('/User-PaymentsFaqs');
    }

    /**
    * updating Pre Anniversary count based on action (update/reset to 0)
    * @param {string} action
    * @returns {unresolved}
    */
    updatePreAnniversaryCnt(action : string) {
        var data = {
          action: action
        };
        return this.api.create('/UpdateUser/updatePreAnnivCount', data);
    };
    
    /**
    * @returns {unresolved}
    */
    setOnboardTourStatus(data: any) {
      return this.api.create('/User-OnboardingTrackEvent/setTourStatus', data);
    };
    
    /**
    * @returns {unresolved}
    */
    trackRegisterEvent(data: any) {
      return this.api.create('/User-OnboardingTrackEvent/trackRegisterEvent', data);
    };
}
