import {PeekCanvasConfig} from "../canvas/PeekCanvasConfig.web";
import {PeekCanvasBounds} from "../canvas/PeekCanvasBounds";
import {DispBaseT, DispHandleI, PointI} from "../canvas-shapes/DispBase";
import {DispFactory} from "../canvas-shapes/DispFactory";
import {PeekCanvasModel} from "../canvas/PeekCanvasModel.web";
import {DrawModeE} from "./PeekDispRenderDrawModeE.web";
export {DrawModeE} from "./PeekDispRenderDrawModeE.web";


export abstract class PeekDispRenderDelegateABC {

    protected constructor(protected config: PeekCanvasConfig,
                          protected model: PeekCanvasModel) {

    }

    abstract updateBounds(disp: DispBaseT, zoom: number,): void ;

    abstract draw(disp, ctx, zoom: number, pan: PointI, drawMode: DrawModeE) ;

    abstract drawSelected(disp, ctx, zoom: number, pan: PointI, drawMode: DrawModeE) ;

    abstract drawEditHandles(disp, ctx, zoom: number, pan: PointI) ;

    handles(disp:DispBaseT): DispHandleI[] {
        const margin = this.config.editor.resizeHandleMargin;
        const width = this.config.editor.resizeHandleWidth;

        const handles: DispHandleI[] = DispFactory.wrapper(disp)
            .handlePoints(disp, margin + width);

        const halfWidth = width / 2.0;

        return handles.map((handle: DispHandleI, index: number) => {
            handle.box = new PeekCanvasBounds(
                handle.center.x - halfWidth,
                handle.center.y - halfWidth,
                width, width
            );
            handle.handleIndex = index;

            return handle;
        });
    }


}