import baseGetLayerMaskProperty from "./_internal/_baseGetLayerMaskProperty";
import isRasterLayer from "./isRasterLayer";

/**
 * 图层存在遮罩谓词，不同于 hasLayerMask，它同时判断 MaskMode。
 *
 * @param {*} layer
 * @returns {layer is RasterLayer}
 * @since 0.1.0
 * @category Soil
 * @see {@linkcode hasLayerMask}
 * @example
 *
 * ```ts
 * const selectedLayer = _.getFirstSelectedLayer();
 * if (_.hasLayerMaskStrict(selectedLayer)) {
 *     let shapePoints: Shape["vertices"] = [];
 *     _.eachProperties(selectedLayer.mask, function (maskAtom: MaskPropertyGroup) {
 *         if (maskAtom.maskMode !== MaskMode.NONE) {
 *             shapePoints = shapePoints.concat(maskAtom.maskPath.value.vertices);
 *         }
 *     });
 *     const xPoints = _.map(shapePoints, (point) => point[0]);
 *     const yPoints = _.map(shapePoints, (point) => point[1]);
 *     const minX = Math.min.apply(null, xPoints);
 *     const minY = Math.min.apply(null, yPoints);
 *     const maxX = Math.max.apply(null, xPoints);
 *     const maxY = Math.max.apply(null, yPoints);
 *     const maskSourceRect = { top: minY, left: minX, width: maxX - minX, height: maxY - minY };
 *     _.log(maskSourceRect);
 * }
 * // 结果：选中图层存在 Mask 且 MaskMode 至少有一个不是 MaskMode.NONE 的前提下，桌面日志会记录所有 mask 组合后的 SoureRect。
 * ```
 */
function hasLayerMaskStrict(layer: any): layer is RasterLayer {
    if (!isRasterLayer(layer)) {
        return false;
    }
    const maskParade = baseGetLayerMaskProperty(layer);
    const numProperties = maskParade.numProperties;
    if (numProperties === 0) {
        return false;
    }

    let index = 0;
    const length = numProperties + 1;

    while (++index < length) {
        const property = maskParade.property(index) as MaskPropertyGroup;
        if (property.maskMode !== MaskMode.NONE) {
            return true;
        }
    }
    return false;
}

export default hasLayerMaskStrict;
