
import { SGraphyItem, SMouseEvent } from '@sybotan-web/graphy'
import { SRect, SSize, SPoint } from "@sybotan-web/base";
import { SPen, SPainter, SColor, SFont } from "@sybotan-web/draw";
import { dataItemPath, dataItem, dataSpaceItem, dataInterface, PolygonItemInterface } from './../dataType'   //传入参数的参数接口类型
/**
 * 不规则多边形Item类
 *
 */
export default class SGraphyPolygonItem extends SGraphyItem {
	pointArr: SPoint[];
	fillColor: SColor = new SColor('#F2F6FC');
	color: SColor = SColor.Black;
	width: number = 200;
	businessId: string | null;
	id: string | null;
	centerOfGravityPoint: { x: number, y: number };
	businessName: null | string | undefined;    //业务空间名字
	initName: null | string | undefined;        //空间名字
	viewText: string = ''                        //绘出的文案
	isBusiness: number = 1;
	cacheColor: SColor = SColor.Black             //需要缓存的边框
	cacheFillColor: SColor = new SColor('#F2F6FC');        //需要缓存的填充色
	cacheWidth: number = 100;
	businessType: string = ''													//类型
	// actived: boolean = false; 				//是否激活
	/**
	 * 构造函数
	 *
	 * @param pointArr									点坐标list
	 * @param width											边框的宽度
	 * @param color											边框的颜色
	 * @param fillColor   							多边形填充的颜色 
	 * @param businessId								空间id
	 * @param businessName							空间名称
	 * @param centerOfGravityPoint			中心点
	 * @param isBusiness								状态
	 * @param parent    
	 */
	constructor(PolygonItemData: PolygonItemInterface) {
		super(PolygonItemData.parent);
		// 修改绘制路径格式
		let newSpacePaths: SPoint[] = PolygonItemData.space.Paths[0].map(item => {
			return new SPoint(item.X, item.Y)
		});
		this.pointArr = newSpacePaths;
		// 填充色
		this.fillColor = PolygonItemData.space.fillColor ? PolygonItemData.space.fillColor : new SColor('#F2F6FC');
		// 边框色
		this.color = PolygonItemData.space.color ? PolygonItemData.space.color : SColor.Black;
		//边框宽度
		this.width = PolygonItemData.space.width ? PolygonItemData.space.width : 100;
		//中心点
		this.centerOfGravityPoint = {
			x: PolygonItemData.space.LocationPoint.X,
			y: -PolygonItemData.space.LocationPoint.Y
		};
		//业务空间类型
		this.isBusiness = PolygonItemData.space.isBusiness ? PolygonItemData.space.isBusiness : 1;
		//业务空间id
		this.businessId = PolygonItemData.space.businessId ? PolygonItemData.space.businessId : null
		//业务空间名称
		this.businessName = PolygonItemData.space.Name;
		this.initName = PolygonItemData.space.Name;
		// 空间id
		this.id = PolygonItemData.space.id;
		this.viewText = PolygonItemData.space.Name;
		//类型
		this.businessType = PolygonItemData.businessType ? PolygonItemData.businessType : ''
	}

	/**
	 * Item对象边界区域
	 * 
	 * @return SRect
	 */
	boundingRect(): SRect {
		let minX = this.pointArr[0].x;
		let maxX = minX;
		let minY = this.pointArr[0].y;
		let maxY = minY;
		for (let i = 1; i < this.pointArr.length; i++) {
			if (this.pointArr[i].x < minX) {
				minX = this.pointArr[i].x
			}
			if (this.pointArr[i].y < minY) {
				minY = this.pointArr[i].y
			}
			if (this.pointArr[i].x > maxX) {
				maxX = this.pointArr[i].x
			}
			if (this.pointArr[i].y > maxY) {
				maxY = this.pointArr[i].y
			}
		}

		return new SRect(
			minX,
			minY,
			maxX - minX,
			maxY - minY
		);
	} // Function boundingRect()

	/**
	 * 判断点是否在区域内
	 * 
	 * @param x 
	 * @param y 
	 */
	contains(x: number, y: number): boolean {
		let nCross = 0,
			point = [x, y],
			APoints = this.pointArr,
			length = APoints.length,
			p1, p2, i, xinters;
		p1 = APoints[0];
		for (i = 1; i <= length; i++) {
			p2 = APoints[i % length];
			if (
				point[0] > Math.min(p1.x, p2.x) &&
				point[0] <= Math.max(p1.x, p2.x)
			) {
				if (point[1] <= Math.max(p1.y, p2.y)) {
					if (p1.x != p2.x) {
						//计算位置信息
						xinters = (point[0] - p1.x) * (p2.y - p1.y) / (p2.x - p1.x) + p1.y;
						if (p1.y == p2.y || point[1] <= xinters) {
							nCross++
						}
					}
				}
			}
			p1 = p2;
		}
		return nCross % 2 === 1
	}
	/**
	 * 
	 * @param text 修改的文字
	 * @param centerOfGravityPoint 文字的坐标
	 */
	addText(text: string, centerOfGravityPoint?: { x: number, y: number }) {
		this.viewText = text;
		if (centerOfGravityPoint) {
			this.centerOfGravityPoint = centerOfGravityPoint
		}
	}
	/**
	 * Item绘制操作
	 *
	 * @param   painter       painter对象
	 * @param   rect          绘制区域
	 */
	onDraw(painter: SPainter, rect?: SRect): void {
		if (this.pointArr.length) {
			painter.pen.color = this.color;
			painter.brush.color = this.fillColor;
			painter.pen.lineWidth = this.width;
			painter.drawPolygon(this.pointArr)
			// let text = ''
			// if (this.businessName || this.businessId) {
			// 	text = '👇   ' + this.businessName
			// } else {
			// 	text = '⬇️   ' + this.initName
			// }
			painter.font.size = this.scale * 200;
			painter.brush.color = SColor.Black;
			// painter.drawText(text,this.centerOfGravityPoint.x,this.centerOfGravityPoint.y)
			painter.drawText(this.viewText, this.centerOfGravityPoint.x, this.centerOfGravityPoint.y)
		}
	}
	onClick(event: SMouseEvent): boolean {
		this.$emit('click', { item: this, event: event });
		return true;
	} // Function onClick()
	/**
  * 鼠标双击事件
  *
  * @param   event   保存事件参数
  * @return  boolean
  */
	onDoubleClick(event: SMouseEvent): boolean {
		this.$emit('doubleClick', event);
		return true;
	}
	/**
  * 鼠标按下事件
  *
  * @param   event   保存事件参数
  * @return  boolean
  */
	onMouseDown(event: SMouseEvent): boolean {
		this.$emit('mouseDown', event);
		return true;
	} // Function onMouseDown()

	/**
	 * 鼠标移动事件
	 *
	 * @param   event   保存事件参数
	 * @return  boolean
	 */
	onMouseMove(event: SMouseEvent): boolean {
		this.$emit('mouseMove', event);
		return true;
	} // Function onMouseMove()

	/**
	 * 释放鼠标事件
	 *
	 * @param   event   保存事件参数
	 * @return  boolean
	 */
	onMouseUp(event: SMouseEvent): boolean {
		this.$emit('mouseUp', event);
		return true;
	}

} // Class SGraphyPolygonItem
