import { CallResult } from "./callResult";
import { batchCmdElement } from "./types/batchElement";

type BX24Rest={
    callMethod(method:string,params:any,cb?:(res:CallResult)=>any):void,
    callBatch<T extends batchCmdElement>(cmd:T, cb:(params:{[key in keyof T]:CallResult})=>void, haltOnError:boolean):void
}

export class BX24Local{
    private BX24Rest:BX24Rest;
    constructor(BX24Rest:BX24Rest){
        this.BX24Rest = BX24Rest
    }

    callBatch<T extends batchCmdElement>(cmd:T, haltOnError?:boolean):Promise<{[key in keyof T]:CallResult}>
    callBatch<T extends batchCmdElement>(cmd:T, cb:(params:{[key in keyof T]:CallResult})=>void):void
    callBatch<T extends batchCmdElement>(cmd:T, cb:(params:{[key in keyof T]:CallResult})=>void, haltOnError:boolean):void
    callBatch<T extends batchCmdElement>(
        cmd:T,
        cb?:((params:{[key in keyof T]:CallResult})=>void)|boolean,
        haltOnError=false
    ):void|Promise<{[key in keyof T]:CallResult}>{
        if (typeof cb === "function"){
            this.BX24Rest.callBatch(cmd, cb as (params:any)=>void, haltOnError)
            return;
        }
        haltOnError = typeof cb === "boolean" ? cb : haltOnError;
        return new Promise((res,rej)=>{
            try {
                this.callBatch(cmd, result=>{
                    res(result);
                });
            } catch (error) {
                rej(error);
            }
        });
    }

    callMethod(method:string, params:any):Promise<CallResult>;
    callMethod(method:string, params:any, cb?:(params:CallResult)=>void):void;
    callMethod(method:string, params:any, cb?:(params:CallResult)=>void):void|Promise<CallResult>{
        if (typeof cb ==='function'){
            this.BX24Rest.callMethod(method, params, cb);
            return;
        }
        return new Promise((resolve, reject)=>{
            try {
                this.callMethod(method, params, result=>{
                    resolve(result);
                });
            } catch (error) {
                reject(error);
            }
        })
    }
}
