/**
 *  @module     MobilePostpaid
 *  @overview   Defines the `MobilePostpaid` class.
 *  
 *  @author     Animesh Mishra <hello@animesh.ltd>
 *  @copyright  © Animesh Ltd. All Rights Reserved.
 */

import * as Request         from "request-promise-native"
import * as RechargeError   from "../RechargeError"
import { Operator }         from "../Operator"
import { RIPCreds }         from "../RIPCreds"
import { RechargeBill }     from "../../index"
import { StatusResponse }   from "../StatusResponse"


/**
 *  Manages all mobile postpaid bill handling and payments.
 */
export class MobilePostpaid {
    public operator: Operator
    public phone: string
    public amount: number

    public constructor(operator: Operator, phone: string, amount: number) {
        this.operator = operator
        this.phone    = phone
        this.amount   = amount
    }

    /**
     *  Pays a mobile postpaid bill.
     */
    public async Pay(creds: RIPCreds, live: boolean = false): Promise<RechargeBill> {
        let options = {
            method: "GET",
            uri: `https://${creds.baseURL}/recharge/mobile/bill`,
            headers: {
                Accept: "application/json"
            },
            qs: {
                client_id: creds.merchantID,
                client_key: creds.merchantKey,
                msisdn: this.phone,
                operator_code: this.operator.code,
                amount: this.amount,
                live: live
            }
        }

        let response = await Request(options)
        response = JSON.parse(response)
        let error = RechargeError.Check(response)
        if(error) { throw error }

        return new RechargeBill(this, response)
    }

    //
    //  Static Methods
    //

    /**
     *  Returns a list of all mobile postpaid operators supported by Rocket in Pocket
     *  API.
     */
    public static async GetOperators(creds: RIPCreds): Promise<Array<Operator>> {
        let options = {
            method: "GET",
            uri: `https://${creds.baseURL}/operators/mobile/bill`,
            headers: {
                Accept: "application/json"
            },
            qs: {
                client_id: creds.merchantID,
                client_key: creds.merchantKey
            }
        }

        let response = await Request(options)
        response = JSON.parse(response)
        let error = RechargeError.Check(response)
        if(error) { throw error }

        let operators = Array<Operator>()
        for(var operator of response) {
            operators.push(new Operator(operator))
        }
        return operators
    }

    /**
     *  Returns the status of a postpaid bill payment done previously. We'll make use of Rocket in
     *  Pocket's callback URL mechanism instead, so this will largely acts as a backup.
     *  
     *  @param creds        Merchant credentials to connect to the Rocket in Pocket API
     *  @param vendorID     ID returned by Rocket in Pocket after successful recharge request
     */
    public static async CheckStatus(creds: RIPCreds, vendorID: string): Promise<StatusResponse> {
        let options = {
            method: "GET",
            uri: `https://${creds.baseURL}/recharge/${vendorID}`,
            headers: {
                Accept: "application/json"
            },
            qs: {
                client_id: creds.merchantID,
                client_key: creds.merchantKey
            }
        }

        let response = await Request(options)
        response = JSON.parse(response)
        let error = RechargeError.Check(response)
        if (error) { throw error }

        return {
            vendorReference: response.rocket_trans_id,
            operatorReference: response.opr_transid,
            status: response.status,
            date: new Date(response.datetime)
        }
    }
}