import { PayWithCodeService } from '../Services/PayWithCodeService';
import { PayOutPaymentRequestBuilder } from '../RequestDTOs/PayOutPaymentRequest';
import { QueryOrderResultBuilder } from '../RequestDTOs/QueryOrderResultRequest';
import { ErrorResponse } from '../ResponseDTOs/ErrorResponse';
import { PayInCreateOrderResponse } from '../ResponseDTOs/PayInCreateOrderResponseOld';
import { PayOutService } from '../Services/PayOutService';
import { BuildPayload } from '../RequestDTOs/PaymentRequest';

export class PayOutServiceManager {
  private payOutService: PayOutService;

  constructor(
    private appId: string,
    private countryCode: string,
    privateKey: string,
    isTest: boolean
  ) {
    this.payOutService = new PayOutService(
      appId,
      countryCode,
      privateKey,
      isTest
    );
  }

  
  

 

  async createOrder(createOrderRequestBuilder: PayOutPaymentRequestBuilder) {
    try {
      // Create order status
      const payOutResponse = await this.payOutService.createOrder(createOrderRequestBuilder);
      console.log("OrderResponse Manager: ", payOutResponse);
      return payOutResponse;
    } catch (error) {
      console.error('Error creating order:', error);
    }
  }

  async fetchOrderStatus(builder: QueryOrderResultBuilder) {
    try {
      const fetchOrderStatusResponse = await this.payOutService.fetchOrderStatus(builder);
      console.log('fetchOrderStatus Response:', fetchOrderStatusResponse);
      return fetchOrderStatusResponse;
    } catch (error) {
      console.error('Error creating order:', error);
    }
  } 

  async queryMerchantBalance(builder: BuildPayload) {
    try {
      // Query Merchant Balance
      const queryMerchantBalanceResp = await this.payOutService.queryMerchantBalance2(builder);
      console.log("fetchOrderStatusResponseCode: ", queryMerchantBalanceResp);
      return queryMerchantBalanceResp; // Return the original response if needed
  } catch (error) {
      console.error('Error fetching order status:', error);
      throw error; // Rethrow the error to propagate it
  }
  }

  async queryBankList(builder: BuildPayload) {
    try {
      const queryBankListResponse = await this.payOutService.queryBankList(builder);
      console.log('Query Bank List Response:', queryBankListResponse);
      return queryBankListResponse;
    } catch (error) {
      console.error('Error creating order:', error);
    }
  } 

  async queryBankAccount(builder: BuildPayload) {
    try {
      const queryBankAccountResponse = await this.payOutService.queryBankAccount(builder);
      console.log('Query Bank List Response:', queryBankAccountResponse);
      return queryBankAccountResponse;
    } catch (error) {
      console.error('Error creating order:', error);
    }
  } 

  async queryPalmPayAccount(builder: BuildPayload) {
    try {
      const queryBankAccountResponse = await this.payOutService.queryPalmPayAccount(builder);
      console.log('queryPalmPayAccount Response:', queryBankAccountResponse);
      return queryBankAccountResponse;
    } catch (error) {
      console.error('Error creating order:', error);
    }
  } 

 
}
