import {
    SColor,
    SPainter,
    SPath2D,
    SPoint,
    SPolygonUtil,
    SRect,
    STextAlign
} from "@persagy-web/draw/lib";
import { SGraphItem } from "@persagy-web/graph/lib";
import { Space } from "@persagy-web/big/lib/types/floor/Space";
import { ItemColor, ItemOrder } from "@persagy-web/big/lib";

/**
 * 模型空间item
 *
 * @author  郝建龙
 */
export class SSpaceItem extends SGraphItem {
    /** 空间所有数据  */
    data: Space;
    /** 空间轮廓线坐标list  */
    readonly pointArr: SPoint[][] = [];
    /** X坐标最小值  */
    minX = Number.MAX_SAFE_INTEGER;
    /** X坐标最大值  */
    maxX = Number.MIN_SAFE_INTEGER;
    /** Y坐标最小值  */
    minY = Number.MAX_SAFE_INTEGER;
    /** Y坐标最大值  */
    maxY = Number.MIN_SAFE_INTEGER;
    /** path对象      */
    private path = new SPath2D();
    /** 高亮状态    */
    private _highLightFlag: boolean = false;
    get highLightFlag(): boolean {
        return this._highLightFlag;
    } // Get highLightFlag
    set highLightFlag(value: boolean) {
        this._highLightFlag = value;
        this.update();
    } // Set highLightFlag
    /** 是否显示名字  */
    private _showBaseName: boolean = false;
    get showBaseName(): boolean {
        return this._showBaseName;
    } // Get showBaseName
    set showBaseName(value: boolean) {
        this._showBaseName = value;
        this.update();
    } // Set showBaseName
    /** 是否名字大小  */
    private _nameSize: number = 10;
    get nameSize(): number {
        return this._nameSize;
    } // Get nameSize
    set nameSize(value: number) {
        this._nameSize = value;
        this.update();
    } // Set nameSize
    /** 名字是否缩放  */
    private _nameTransform: boolean = false;
    get nameTransform(): boolean {
        return this._nameTransform;
    } // Get nameTransform
    set nameTransform(value: boolean) {
        this._nameTransform = value;
        this.update();
    } // Set nameTransform
    /** 名字颜色    */
    private _nameColor: string = "#000000";
    get nameColor(): string {
        return this._nameColor;
    } // Get nameColor
    set nameColor(value: string) {
        this._nameColor = value;
        this.update();
    } // Set nameColor

    /**
     * 构造函数
     *
     * @param parent    指向父对象
     * @param data      空间数据
     */
    constructor(parent: SGraphItem | null, data: Space) {
        super(parent);
        this.data = data;
        this.zOrder = ItemOrder.spaceOrder;
        let tempArr = this.data.OutLine;
        this.name = data.Name || "";
        if (tempArr && tempArr.length) {
            this.minX = tempArr[0][0].X;
            this.maxX = this.minX;
            this.minY = -tempArr[0][0].Y;
            this.maxY = this.minY;
            this.pointArr = tempArr.map((t): SPoint[] => {
                let temp = t.map(
                    (it): SPoint => {
                        let x = it.X,
                            y = -it.Y;
                        if (x < this.minX) {
                            this.minX = x;
                        }
                        if (y < this.minY) {
                            this.minY = y;
                        }
                        if (x > this.maxX) {
                            this.maxX = x;
                        }
                        if (y > this.maxY) {
                            this.maxY = y;
                        }
                        return new SPoint(x, y);
                    }
                );
                this.path.polygon(temp);
                return temp;
            });
        }
    } // Constructor

    /**
     * Item对象边界区域
     *
     * @return SRect
     */
    boundingRect(): SRect {
        return new SRect(
            this.minX,
            this.minY,
            this.maxX - this.minX,
            this.maxY - this.minY
        );
    } // Function boundingRect()

    /**
     * 判断点是否在区域内
     *
     * @param x
     * @param y
     */
    contains(x: number, y: number): boolean {
        let arr = this.pointArr;
        if (arr.length < 1 || !SPolygonUtil.pointIn(x, y, arr[0])) {
            return false;
        }

        for (let i = 1; i < arr.length; i++) {
            if (SPolygonUtil.pointIn(x, y, arr[i])) {
                return false;
            }
        }
        return true;
    } // Function contains()

    /**
     * Item绘制操作
     *
     * @param   painter       painter对象
     */
    onDraw(painter: SPainter): void {
        painter.pen.color = ItemColor.spaceBorderColor;
        if (this.selected) {
            painter.brush.color = ItemColor.selectColor;
        } else if (this.highLightFlag) {
            painter.brush.color = ItemColor.spaceHighColor;
        } else {
            painter.brush.color = ItemColor.spaceColor;
        }
        painter.pen.lineWidth = painter.toPx(1);
        painter.drawPath(this.path);

        if (this.showBaseName) {
            if (this.name && this.name != "null") {
                painter.brush.color = new SColor(this.nameColor);
                if (this.nameTransform) {
                    painter.font.size = this.nameSize;
                } else {
                    painter.font.size = painter.toPx(this.nameSize);
                }
                // painter.font.size = 500;
                painter.font.textAlign = STextAlign.Center;
                painter.drawText(
                    this.name,
                    this.data.Location.Points[0].X,
                    -this.data.Location.Points[0].Y
                );
            }
        }
    } // Function onDraw()
} // Class SSpaceItem
