import fs from 'fs';
import path from 'path';

import { BrowserInterface } from '../../../src/typings';

import { GetServiceAccountsRequestHandler } from './get-service-accounts-request-handler';

const workFlowConfigFilePath = path.join(
  'src',
  'services',
  'workflow',
  'workflow.json',
);
const apsWorkflowJson = JSON.parse(
  fs.readFileSync(workFlowConfigFilePath).toString(),
);

export class GetServiceAccountsRequestHandlerImpl
  implements GetServiceAccountsRequestHandler
{
  // tslint:disable-next-line: no-empty
  async type() {}

  async waitForResponse(
    urlOrPredicate:
      | string
      | ((res: BrowserInterface.HTTPResponse) => boolean | Promise<boolean>),
    options?: {
      timeout?: number;
    },
  ) {
    try {
      if (
        urlOrPredicate === apsWorkflowJson.getServiceAccounts.userDetailsUrl
      ) {
        const data = {
          Details: {
            profileData: {
              MainPersonName: 'Naval,Ravi',
            },
            AccountDetails: {
              getAccountDetailsResponse: {
                getAccountDetailsRes: {
                  getPersonDetails: {
                    accountID: '816567445',
                    results: [
                      {
                        personID: '0350831000',
                        personName: 'Naval,Ravi',
                        accountRelationship: 'JAH-SP',
                      },
                      {
                        personID: '0967061000',
                        personName: 'Naval,George',
                        accountRelationship: 'MAIN',
                      },
                      {
                        personID: '0967061000',
                        personName: 'Naval,George',
                        accountRelationship: 'MAIN',
                      },
                    ],
                  },
                  getSASPListByAccountID: {
                    premiseDetailsList: [
                      {
                        premiseID: '7123467556',
                        sASPDetails: [
                          {
                            sPID: '8164327863',
                            sPType: 'PROD',
                            meterBadgeNumber: '1143088',
                            sAID: '',
                            sACISDiv: '',
                            isEligibleDemandRate: 'true',
                            totalElectricChargeAmount: '',
                          },
                          {
                            sPID: '8161046816',
                            sPType: 'RES',
                            meterBadgeNumber: '1211831',
                            sAID: '7139371525',
                            sACISDiv: 'APS',
                            isEligibleDemandRate: 'true',
                            totalElectricChargeAmount: '128.32',
                          },
                        ],
                      },
                    ],
                  },
                },
              },
            },
          },
        };
        return Promise.resolve(data);
      }
    } catch (err) {
      return Promise.reject(err);
    }
  }

  async waitForSelector(
    selector: string,
    options?: {
      visible?: boolean;
      hidden?: boolean;
      timeout?: number;
    },
  ) {
    try {
      if (selector === apsWorkflowJson.getServiceAccounts.addressDataSelector) {
        return Promise.resolve(null);
      }
    } catch (err) {
      return Promise.reject(err);
    }
  }

  async $eval<ReturnType>(
    selector: string,
    pageFunction: (
      element: Element,
      ...args: unknown[]
    ) => ReturnType | Promise<ReturnType>,
  ) {
    if (selector === apsWorkflowJson.getServiceAccounts.addressDataSelector) {
      const data: Awaited<any> =
        'Mailing address416115 N JW Marriot RD # 120-156, SCOTTSDALE,  ARIZONA,85641,  USA';
      return Promise.resolve(data);
    }
  }
}
