/* tslint:disable:no-console */
import * as dotenv from 'dotenv'
import 'mocha'

import { RawAbiTests } from './common/raw-abi.spec';
import { WrongRequestsTests } from './common/wrong-requests.spec';
import { GenericActionsTests } from './common/generic-actions.spec';
import { AccountPermissionsTests } from './common/account-permissions.spec';
import { FioPermissionsTests } from './common/fio-permissions.spec';
import { VoteBlockProducerTests } from './common/vote-blockproducer.spec';
import { StakeTokensTests } from './common/stake-tokens.spec';
import { NftsTests } from './common/nfts.spec';
import { FioRequestApproveAndPayFundsTests } from './common/fio-request-approve-pay-funds.spec';
import { FioRequestCancelTests } from './common/fio-request-cancel.spec';

import {
    FIOSDK,
} from '../src/FIOSDK';

import { defaultFee } from './constants';
import { FioRequestRejectTests } from './common/fio-request-reject.spec';
import { TransferTokensTests } from './common/transfer-tokens.spec';
import { RecordObtDataTests } from './common/record-obt-data.spec';
import { CheckTransactionTests } from './common/check-transaction.spec';
import { CheckTransactionWithReturnedBackUrlTests } from './common/check-transaction-with-returned-back-url.spec';
import { timeout, fetchJson } from './utils';
import { EncryptDecryptContentTests } from './common/encrypt-decrypt-content.spec';
import { FioRequestsWithDifferentEncryptKeysTests } from './common/fio-requests-with-different-encrypt-keys.spec';

dotenv.config({path: ['.env.test', '.env']})

/**
 * Please set your private/public keys and existing fioAddresses
 */
const privateKey = process.env.PRIVATE_KEY as string
const publicKey = process.env.PUBLIC_KEY as string

const privateKey2 = process.env.PRIVATE_KEY_2 as string
const publicKey2 = process.env.PUBLIC_KEY_2 as string

const faucetPriv = process.env.FAUCET_PRIVATE_KEY as string
const faucetPub = process.env.FAUCET_PUBLIC_KEY as string

const testFioAddressName = process.env.TEST_FIO_ADDRESS_NAME as string
const testFioAddressName2 = process.env.TEST_FIO_ADDRESS_NAME_2 as string
const testFioDomainName = process.env.TEST_FIO_DOMAIN_NAME as string

/**
 * Public Testnet API nodes can be found at: https://bpmonitor.fio.net/?chain=Testnet
 */

const baseUrls = ['https://test.fio.eosusa.io/v1/']

const proxyTpId = 'eosusa@fiotestnet';

let fioSdk: FIOSDK = new FIOSDK({ privateKey, publicKey, apiUrls: baseUrls, fetchJson })
let fioSdk2: FIOSDK = new FIOSDK({ privateKey: privateKey2, publicKey: publicKey2, apiUrls: baseUrls, fetchJson })
let fioSdkWithWrongBaseUrl: FIOSDK = new FIOSDK({ privateKey: privateKey2, publicKey: publicKey2, apiUrls: baseUrls, fetchJson })

before(async () => {
    try {
        const isAvailableResult = await fioSdk.genericAction('isAvailable', {
            fioName: testFioAddressName,
        })
        if (!isAvailableResult.is_registered) {
            await fioSdk.genericAction('registerFioAddress', {
                fioAddress: testFioAddressName,
                maxFee: defaultFee,
            })
        }
    } catch (e) {
        console.log(e)
    }
    try {
        const isAvailableResult2 = await fioSdk2.genericAction('isAvailable', {
            fioName: testFioAddressName2,
        })
        if (!isAvailableResult2.is_registered) {
            await fioSdk2.genericAction('registerFioAddress', {
                fioAddress: testFioAddressName2,
                maxFee: defaultFee,
            })
        }
    } catch (e) {
        console.log(e)
    }

    const fioSdkFaucet = new FIOSDK({
        privateKey: faucetPriv,
        publicKey: faucetPub,
        apiUrls: baseUrls,
        fetchJson,
    })

    await fioSdkFaucet.transferTokens({
        payeeFioPublicKey: publicKey,
        amount: defaultFee * 4,
        maxFee: defaultFee,
    })

    await timeout(4000)
})

RawAbiTests({ fioSdk });
WrongRequestsTests({ fioSdk, baseUrls, fioSdkWithWrongBaseUrl });

GenericActionsTests({ fioSdk, fioSdk2, publicKey, publicKey2, testFioDomainName, testFioAddressName });

FioPermissionsTests({ fioSdk, publicKey, publicKey2 });
AccountPermissionsTests({ fioSdk, fioSdk2, publicKey, publicKey2, testFioDomainName, testFioAddressName });

VoteBlockProducerTests({ fioSdk, publicKey, proxyTpId, testFioAddressName });

StakeTokensTests({ fioSdk, publicKey, testFioAddressName });

NftsTests({ fioSdk, testFioAddressName });

FioRequestApproveAndPayFundsTests({ fioSdk, fioSdk2, publicKey, publicKey2, testFioAddressName, testFioAddressName2 });
FioRequestCancelTests({ fioSdk2, testFioAddressName, testFioAddressName2 });
FioRequestRejectTests({ fioSdk, fioSdk2, testFioAddressName, testFioAddressName2 });
FioRequestsWithDifferentEncryptKeysTests({ baseUrls, faucetPriv, faucetPub });
RecordObtDataTests({ fioSdk, fioSdk2, publicKey, publicKey2, testFioAddressName, testFioAddressName2 });

TransferTokensTests({ fioSdk, fioSdk2, publicKey2 });

EncryptDecryptContentTests({ baseUrls });

CheckTransactionTests({ fioSdk2, testFioAddressName, testFioAddressName2 });
CheckTransactionWithReturnedBackUrlTests({ fioSdk2, testFioAddressName, testFioAddressName2 });
