import { widgetName, defaultPageSize, defaultCustomFilterStartTime, defaultCustomFilterEndTime } from "./constants";
import { IModelBinder } from "@paperbits/common/editing";
import { ReportsByApiModel } from "./reportsByApiModel";
import { Contract } from "@paperbits/common";
import { ReportsByApiContract } from "./reportsByApiContract";

/**
 * This is a class that helps to prepare the model using data described
 * in the contract.
 */
export class ReportsByApiModelBinder implements IModelBinder<ReportsByApiModel> {
    public canHandleContract(contract: Contract): boolean {
        return contract.type === widgetName;
    }

    public canHandleModel(model: any): boolean {
        return model instanceof ReportsByApiModel;
    }

    public async contractToModel(contract: ReportsByApiContract): Promise<ReportsByApiModel> {
        const model = new ReportsByApiModel();
        model.pageSize = contract.pageSize || defaultPageSize;
        model.customFilterStartTime = contract.customFilterStartTime || defaultCustomFilterStartTime;
        model.customFilterEndTime = contract.customFilterEndTime || defaultCustomFilterEndTime;
        return model;
    }

    public modelToContract(model: ReportsByApiModel): Contract {
        const contract: ReportsByApiContract = {
            type: widgetName,
            pageSize: model.pageSize,
            customFilterStartTime: model.customFilterStartTime,
            customFilterEndTime: model.customFilterEndTime,
        };

        return contract;
    }
}
