package com.dne.ems.dto;

import com.dne.ems.model.enums.PollutionType;
import com.dne.ems.model.enums.SeverityLevel;

import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;

/**
 * 公众反馈提交请求数据传输对象
 *
 * <p>用于接收公众用户提交的环境问题反馈，包含问题描述、分类和位置信息
 *
 * <p>业务规则：
 * <ul>
 *   <li>提交后状态自动设为PENDING_REVIEW(待审核)</li>
 *   <li>需经过主管审核后才能创建任务</li>
 *   <li>位置信息必须包含有效的网格坐标</li>
 * </ul>
 *
 * @param title 反馈标题(必填，最长255字符)
 * @param description 问题详细描述(可选)
 * @param pollutionType 污染类型(必填)
 * @param severityLevel 严重等级(必填)
 * @param location 地理位置信息(必填)
 * @see com.dne.ems.model.enums.PollutionType 污染类型枚举
 * @see com.dne.ems.model.enums.SeverityLevel 严重级别枚举
 */
public record FeedbackSubmissionRequest(
    @NotEmpty(message = "标题不能为空")
    @Size(max = 255, message = "标题长度不能超过255个字符")
    String title,

    String description,

    @NotNull(message = "污染类型不能为空")
    PollutionType pollutionType,

    @NotNull(message = "严重等级不能为空")
    SeverityLevel severityLevel,

    @NotNull(message = "地理位置信息不能为空")
    @Valid
    LocationData location
) {
    /**
     * 地理位置数据(嵌套记录)
     *
     * <p>用于精确定位反馈问题的发生位置
     *
     * <p>验证规则：
     * <ul>
     *   <li>文字地址必须符合"省-市-区"格式</li>
     *   <li>网格坐标必须在有效范围内(1-1000)</li>
     *   <li>经纬度坐标可选，但提供时可提高定位精度</li>
     * </ul>
     *
     * @param latitude 纬度坐标(可选)
     * @param longitude 经度坐标(可选)
     * @param textAddress 文字地址(必填，格式："省-市-区")
     * @param gridX 网格X坐标(必填，范围1-1000)
     * @param gridY 网格Y坐标(必填，范围1-1000)
     */
    public record LocationData(
        Double latitude,
        Double longitude,
        @NotEmpty(message = "文字地址不能为空")
        String textAddress,

        @NotNull(message = "网格X坐标不能为空")
        Integer gridX,

        @NotNull(message = "网格Y坐标不能为空")
        Integer gridY
    ) {}
} 