import logger from "../reporting-helpers/logger";

export const randomInputTypes = ['email', 'password'] as const;
export type RandomInputType = typeof randomInputTypes[number];
// @ts-ignore
import faker from 'faker'

export class DataHelper {

    public static getRandomFirstName() {
        return faker.name.firstName();
    }

    public static getRandomLastName() {
        return faker.name.lastName();
    }

    public static getRandomEmailAddress() {
        return faker.internet.email();
    }

    public static getRandomData(dataType: string) {
        let randomData: string = '';
        switch (dataType.toLocaleLowerCase()) {
            case 'email address':
                randomData = DataHelper.getRandomEmailAddress();
                break;
            case 'first name':
                randomData = DataHelper.getRandomFirstName();
                break;
            case 'last name':
                randomData = DataHelper.getRandomLastName();
                break;
            default:
                throw Error(`No case implemented for random ${dataType}`)
                break;
        }
        return randomData;
    }

    public static getPostcodeByState(state: string) {
        let postcode: string = '';
        switch (state.toLocaleLowerCase()) {
            case 'act':
                postcode = '2900';
                break;
            case 'nsw':
                postcode = '2000';
                break;
            case 'nt':
                postcode = '0800';
                break;
            case 'sa':
                postcode = '5018';
                break;
            case 'tas':
                postcode = '7010';
                break;
            case 'nz':
                postcode = '5022';
                break;
            case 'vic':
                postcode = '3000';
                break;
            default:
                postcode = '4000';
                break;
        }
        return postcode;
    }

    public static getValueFromCollection(data: { [k: string]: any }, myKey: string): any {
        if (this.isKeyExistsInMyCollection(data, myKey))
            return data[myKey]
        else
            throw Error(`Key : "${myKey}" is NOT FOUND in the object "data"`)
    }

    public static addDataToCollection(data: { [k: string]: any }, myKey: string, myValue: any): void {
        data[myKey] = myValue;
        logger.info(`"${myKey}" = "${myValue}" is added to collection "${data}"`);
    }

    public static isKeyExistsInMyCollection(data: { [k: string]: any }, myKey: string): boolean {
        return data[myKey];
    }

    public static cleanMyCollection(data: { [k: string]: any }): void {
        data = {};
        logger.info(`Collection "${data}" is CLEARED now`);
    }

    public static getDataFromSimpleObject(data: {}, expectedKey: string): string {
        if (Object.keys(data).length === 0)
            throw Error(`"${data}" is blank, no KEY found`);
        else if (expectedKey in data)
            return data[expectedKey]
        else
            throw Error(`Key "${expectedKey}" is NOT FOUND in "${data}"`)
    }

    public static isObjectEmpty(data: {}): boolean {
        return (Object.keys(data).length === 0);
    }
}




