import { WrapLayout as WrapLayoutDefinition } from ".";
import { LayoutBase, Property, isIOS, Length } from "../layout-base";

export * from "../layout-base";

export class WrapLayoutBase extends LayoutBase implements WrapLayoutDefinition {
    public orientation: "horizontal" | "vertical";
    public itemWidth: Length;
    public itemHeight: Length;
    public effectiveItemWidth: number;
    public effectiveItemHeight: number;
}

// WrapLayoutBase.prototype.recycleNativeView = true;

export const itemWidthProperty = new Property<WrapLayoutBase, Length>({
    name: "itemWidth", defaultValue: "auto", affectsLayout: isIOS, valueConverter: (v) => Length.parse(v),
    valueChanged: (target, oldValue, newValue) => target.effectiveItemWidth = Length.toDevicePixels(newValue, -1)
});
itemWidthProperty.register(WrapLayoutBase);

export const itemHeightProperty = new Property<WrapLayoutBase, Length>({
    name: "itemHeight", defaultValue: "auto", affectsLayout: isIOS, valueConverter: (v) => Length.parse(v),
    valueChanged: (target, oldValue, newValue) => target.effectiveItemHeight = Length.toDevicePixels(newValue, -1)
});
itemHeightProperty.register(WrapLayoutBase);

export const orientationProperty = new Property<WrapLayoutBase, "horizontal" | "vertical">({
    name: "orientation", defaultValue: "horizontal", affectsLayout: isIOS,
    valueConverter: (v) => {
        if (v === "horizontal" || v === "vertical") {
            return <"horizontal" | "vertical">v;
        }

        throw new Error(`Invalid orientation value: ${v}`);
    }
});
orientationProperty.register(WrapLayoutBase);
