package com.ycwl.basic.image.watermark.edge;

import com.ycwl.basic.puzzle.entity.PuzzleElementEntity;
import com.ycwl.basic.puzzle.entity.PuzzleTemplateEntity;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * Normal 风格水印模板构建器
 * 对应 NormalWatermarkOperator
 *
 * 布局说明（百分比基于1920x1080量化，精度0.5%）：
 * - 白色背景 + 原图元素（COVER模式）
 * - 左下角：圆形二维码（右边界在宽度45%位置）
 * - 二维码中央：圆形头像（可选）
 * - 二维码右侧：景区名 + 日期时间 两行文字（白色，左对齐）
 */
@Component
public class NormalWatermarkTemplateBuilder extends AbstractWatermarkTemplateBuilder {

    public static final String STYLE = "normal";

    // 百分比常量配置（基于1920x1080量化，精度0.5%）
    /** 底部距离占高度百分比 */
    private static final double BOTTOM_OFFSET_PERCENT = 0.085;       // 8.5%
    /** 二维码大小占宽度百分比 */
    private static final double QRCODE_SIZE_PERCENT = 0.08;          // 8%
    /** 二维码右边界占宽度百分比 */
    private static final double QRCODE_RIGHT_PERCENT = 0.45;         // 45%
    /** 二维码Y方向偏移（向上）占高度百分比 */
    private static final double QRCODE_OFFSET_Y_PERCENT = 0.02;      // 2%
    /** 文字区域起始X位置占宽度百分比 */
    private static final double TEXT_START_X_PERCENT = 0.455;        // 45.5%
    /** 字体大小占高度百分比 */
    private static final double FONT_SIZE_PERCENT = 0.04;            // 4%
    /** 文字行间距占高度百分比 */
    private static final double LINE_SPACING_PERCENT = 0.005;        // 0.5%
    /** 文字区域右边距占宽度百分比 */
    private static final double TEXT_RIGHT_MARGIN_PERCENT = 0.01;    // 1%

    private static final String FONT_COLOR = "#FFFFFF";

    @Override
    public String getStyle() {
        return STYLE;
    }

    @Override
    public WatermarkTemplateResult build(WatermarkRequest request) {
        int imageWidth = request.getImageWidth();
        int imageHeight = request.getImageHeight();

        // 根据百分比计算实际像素值
        int bottomOffset = (int) (imageHeight * BOTTOM_OFFSET_PERCENT);
        int qrcodeSize = (int) (imageWidth * QRCODE_SIZE_PERCENT);
        int qrcodeRightX = (int) (imageWidth * QRCODE_RIGHT_PERCENT);
        int qrcodeOffsetY = (int) (imageHeight * QRCODE_OFFSET_Y_PERCENT);
        int textStartX = (int) (imageWidth * TEXT_START_X_PERCENT);
        int fontSize = (int) (imageHeight * FONT_SIZE_PERCENT);
        int lineSpacing = (int) (imageHeight * LINE_SPACING_PERCENT);
        int textRightMargin = (int) (imageWidth * TEXT_RIGHT_MARGIN_PERCENT);

        // 创建模板（白色背景，原图作为元素实现 COVER 模式）
        PuzzleTemplateEntity template = createTemplateWithColor(
                "watermark_normal_" + System.currentTimeMillis(),
                imageWidth,
                imageHeight,
                "#FFFFFF"
        );

        List<PuzzleElementEntity> elements = newElementList();
        Map<String, String> dynamicData = newDynamicData();

        // 0. 原图元素（z-index=1，最底层，COVER模式）
        PuzzleElementEntity originalImageElement = createImageElement(
                "originalImage", "原图",
                0, 0,
                imageWidth, imageHeight, 1,
                FIT_MODE_COVER, null, null
        );
        elements.add(originalImageElement);
        dynamicData.put("originalImage", request.getOriginalImageUrl());

        // 计算二维码位置（右边界在45%位置，向左推算左边界）
        int qrcodeX = qrcodeRightX - qrcodeSize;
        int qrcodeY = imageHeight - bottomOffset - qrcodeSize - qrcodeOffsetY;

        // 1. 二维码元素（圆形裁切）
        PuzzleElementEntity qrcodeElement = createCircleImageElement(
                "qrcode", "二维码",
                qrcodeX, qrcodeY,
                qrcodeSize, 10
        );
        elements.add(qrcodeElement);
        dynamicData.put("qrcode", request.getQrcodeUrl());

        // 2. 头像元素（圆形，二维码中央，可选）
        if (request.getFaceUrl() != null && !request.getFaceUrl().isEmpty()) {
            int avatarDiameter = (int) (qrcodeSize * 0.45);
            int avatarX = qrcodeX + (qrcodeSize - avatarDiameter) / 2;
            int avatarY = qrcodeY + (qrcodeSize - avatarDiameter) / 2;

            PuzzleElementEntity faceElement = createCircleImageElement(
                    "face", "头像",
                    avatarX, avatarY,
                    avatarDiameter, 20
            );
            elements.add(faceElement);
            dynamicData.put("face", request.getFaceUrl());
        }

        // 3. 景区名文字（在二维码右侧，从45.5%位置开始，左对齐）
        // 文字垂直居中于二维码区域
        int textAreaHeight = fontSize * 2 + lineSpacing;
        int textY = qrcodeY + (qrcodeSize - textAreaHeight) / 2;

        PuzzleElementEntity scenicTextElement = createTextElement(
                "scenicLine", "景区名",
                textStartX, textY,
                imageWidth - textStartX - textRightMargin, fontSize + lineSpacing, 30,
                "PingFang SC", fontSize, FONT_COLOR,
                "NORMAL", TEXT_ALIGN_LEFT
        );
        elements.add(scenicTextElement);
        dynamicData.put("scenicLine", request.getScenicLine() != null ? request.getScenicLine() : "");

        // 4. 日期时间文字（在景区名下方，左对齐）
        int datetimeY = textY + fontSize + lineSpacing;

        PuzzleElementEntity datetimeTextElement = createTextElement(
                "datetimeLine", "日期时间",
                textStartX, datetimeY,
                imageWidth - textStartX - textRightMargin, fontSize + lineSpacing, 30,
                "PingFang SC", fontSize, FONT_COLOR,
                "NORMAL", TEXT_ALIGN_LEFT
        );
        elements.add(datetimeTextElement);
        dynamicData.put("datetimeLine", request.getDatetimeLine() != null ? request.getDatetimeLine() : "");

        return createResult(template, elements, dynamicData);
    }
}
