package com.infoepoch.pms.agent.platform.agent.adapter.out.tool;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.stereotype.Component;

import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.TextStyle;
import java.util.Locale;

/**
 * 系统内置工具：获取当前服务器时间。
 * <p>
 * 挂载到主 ReactAgent，当用户提到"今天"、"明天"、"下周"等相对日期时，
 * 大模型会先调用此工具获取当前时间，再推算具体日期。
 * </p>
 */
@Component
public class GetCurrentTimeTool {

    /**
     * 获取当前上海时区时间。
     *
     * @return 包含日期、时间、星期的时间结构
     */
    @Tool(description = "获取当前服务器时间，当需要处理'今天'、'明天'、'后天'、'下周'等相对日期时必须先调用此工具")
    public CurrentTimeResult getCurrentTime() {
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Shanghai"));
        return new CurrentTimeResult(
                now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                now.format(DateTimeFormatter.ofPattern("HH:mm:ss")),
                now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")),
                now.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE),
                "Asia/Shanghai"
        );
    }

    /**
     * 当前时间结果值对象。
     *
     * @param date      日期，格式 yyyy-MM-dd
     * @param time      时间，格式 HH:mm:ss
     * @param datetime  日期时间，格式 yyyy-MM-dd HH:mm:ss
     * @param dayOfWeek 星期几，如"星期一"
     * @param timezone  时区名称
     */
    public record CurrentTimeResult(
            String date,
            String time,
            String datetime,
            String dayOfWeek,
            String timezone
    ) {
    }
}
