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

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

import { GetMonthlyUtilityDataRequestHandler } from './get-monthly-utility-data-request-handler';
import { MockElementHandle } from './mock-element-handle';
import { MockTarget } from './mock-target';

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

export class GetMonthlyUtilityDataRequestHandlerImpl
  implements GetMonthlyUtilityDataRequestHandler
{
  serviceAccountId = '7123467556';

  // 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.getMonthlyUtilityData.billDetailsUrl
      ) {
        const data = {};
        return Promise.resolve(data);
      }
      if (
        urlOrPredicate === apsWorkflowJson.getMonthlyUtilityData.userDetailsUrl
      ) {
        const data = {
          Details: {
            AccountDetails: {
              getAccountDetailsResponse: {
                getAccountDetailsRes: {
                  getSASPListByAccountID: {
                    premiseDetailsList: [
                      {
                        premiseID: '7123467556',
                      },
                    ],
                  },
                },
              },
            },
          },
        };
        return Promise.resolve(data);
      }
    } catch (err) {
      return Promise.reject(err);
    }
  }

  async $eval<ReturnType>(
    selector: string,
    pageFunction: (
      element: Element,
      ...args: unknown[]
    ) => ReturnType | Promise<ReturnType>,
  ) {
    if (
      selector ===
      apsWorkflowJson.getMonthlyUtilityData.selectValueStringSelector
    ) {
      const data: Awaited<any> = ' 1 - 10  of 25';
      return Promise.resolve(data);
    }
  }

  async select(selector: string, ...values: string[]) {
    try {
      if (
        selector === apsWorkflowJson.getMonthlyUtilityData.selectStringSelector
      ) {
        const data: string[] = ['desired number of pages selected'];
        return Promise.resolve(data);
      }
    } catch (err) {
      return Promise.reject(err);
    }
  }

  // tslint:disable-next-line: function-name
  async $$(selector: string) {
    try {
      if (
        selector === apsWorkflowJson.getMonthlyUtilityData.billsDataSelector
      ) {
        const data: BrowserInterface.ElementHandle[] = [
          new MockElementHandle(this.serviceAccountId),
        ];
        return Promise.resolve(data);
      }
    } catch (err) {
      return Promise.reject(err);
    }
  }
  // tslint:disable-next-line: function-name
  async $$eval<ReturnType>(
    selector: string,
    pageFunction: (
      elements: Element[],
      ...args: unknown[]
    ) => ReturnType | Promise<ReturnType>,
  ) {
    if (
      selector === apsWorkflowJson.getMonthlyUtilityData.billsDateStringSelector
    ) {
      const data: Awaited<any> = [' Sep 08, 2021 '];
      return Promise.resolve(data);
    }
  }

  target() {
    return new MockTarget();
  }
}
