import type { Message } from './Message'

/**
 * 收费合约接口
 */
export interface IPaymentFeeContract {
    /**
     * 检查收费情况，是否需要进行收费
     * @param args 收费参数
     * @param isPaymentFee 是否需要进行收费
     * @returns 检查是否成功
     */
    CheckFee(args: PaymentFeeArguments, isPaymentFee: { value: boolean }): boolean

    /**
     * 执行收费决策界面
     * @param args 收费参数 
     * @returns 收费是否成功
     */
    RaisePaymentFee(args: PaymentFeeArguments): boolean
}

/**
 * 收费参数类
 */
export class PaymentFeeArguments {
    private readonly _message: Message
    private readonly _metadata: Map<string, any>

    /**
     * 构造函数
     * @param message 通讯报文
     */
    constructor(message: Message) {
        this._message = message
        this._metadata = new Map<string, any>()
    }

    /**
     * 获取通讯报文
     */
    public get Message(): Message {
        return this._message
    }

    /**
     * 获取元数据集合
     */
    public get Metadata(): Map<string, any> {
        return this._metadata
    }
}

// Vue组件封装
export const usePaymentFeeContract = (impl: IPaymentFeeContract) => {
    return {
        CheckFee: (args: PaymentFeeArguments, isPaymentFee: { value: boolean }) => 
            impl.CheckFee(args, isPaymentFee),
        RaisePaymentFee: (args: PaymentFeeArguments) => 
            impl.RaisePaymentFee(args)
    }
}