package com.dne.ems.dto;

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

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

/**
 * 任务创建请求数据传输对象
 *
 * <p>用于主管直接创建任务，包含任务基本属性和位置信息
 *
 * <p>业务规则：
 * <ul>
 *   <li>创建后状态为PENDING_ASSIGNMENT(待分配)</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 TaskCreationRequest(
    @NotBlank(message = "Title is mandatory")
    String title,

    String description,

    @NotNull(message = "Pollution type is mandatory")
    PollutionType pollutionType,

    @NotNull(message = "Severity level is mandatory")
    SeverityLevel severityLevel,

    @NotNull(message = "Location information is mandatory")
    LocationDTO 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 LocationDTO(
        Double latitude,
        Double longitude,
        @NotBlank(message = "Text address is mandatory")
        String textAddress,

        @NotNull(message = "Grid X coordinate is mandatory")
        Integer gridX,

        @NotNull(message = "Grid Y coordinate is mandatory")
        Integer gridY
    ) {}
} 