package shop.alien.api.feign;

import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 和风城市天气
 *
 * @author ssk
 * @version 1.0
 * @date 2025/3/19 13:18
 */
@FeignClient(url = "https://devapi.qweather.com/v7", name = "heFengWeather")
public interface QWeatherWeatherFeign {

    /**
     * 实时天气
     *
     * @param key      和风天气密钥
     * @param location (必选)需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标（十进制，最多支持小数点后两位），LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92
     * @param lang     多语言设置，请阅读多语言文档，了解我们的多语言是如何工作、如何设置以及数据是否支持多语言。
     * @param unit     数据单位设置，可选值包括unit=m（公制单位，默认）和unit=i（英制单位）。更多选项和说明参考度量衡单位。
     * @return code 请参考状态码
     * updateTime 当前API的最近更新时间
     * fxLink 当前数据的响应式页面，便于嵌入网站或应用
     * now.obsTime 数据观测时间
     * now.temp 温度，默认单位：摄氏度
     * now.feelsLike 体感温度，默认单位：摄氏度
     * now.icon 天气状况的图标代码，另请参考天气图标项目
     * now.text 天气状况的文字描述，包括阴晴雨雪等天气状态的描述
     * now.wind360 风向360角度
     * now.windDir 风向
     * now.windScale 风力等级
     * now.windSpeed 风速，公里/小时
     * now.humidity 相对湿度，百分比数值
     * now.precip 过去1小时降水量，默认单位：毫米
     * now.pressure 大气压强，默认单位：百帕
     * now.vis 能见度，默认单位：公里
     * now.cloud 云量，百分比数值。可能为空
     * now.dew 露点温度。可能为空
     * refer.sources 原始数据来源，或数据源说明，可能为空
     * refer.license 数据许可或版权声明，可能为空
     */
    @GetMapping(value = "/weather/now")
    JSONObject weatherNow(
            @RequestParam(value = "key") String key,
            @RequestParam(value = "location") String location,
            @RequestParam(value = "lang") String lang,
            @RequestParam(value = "unit") String unit
    );

    /**
     * 每日天气预报
     *
     * @param key      和风天气密钥
     * @param location (必选)需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标（十进制，最多支持小数点后两位），LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92
     * @param lang     多语言设置，请阅读多语言文档，了解我们的多语言是如何工作、如何设置以及数据是否支持多语言。
     * @param unit     数据单位设置，可选值包括unit=m（公制单位，默认）和unit=i（英制单位）。更多选项和说明参考度量衡单位。
     * @param days     3d/7d/10d/15d/30d
     * @return code 请参考状态码
     * updateTime 当前API的最近更新时间
     * fxLink 当前数据的响应式页面，便于嵌入网站或应用
     * daily.fxDate 预报日期
     * daily.sunrise 日出时间，在高纬度地区可能为空
     * daily.sunset 日落时间，在高纬度地区可能为空
     * daily.moonrise 当天月升时间，可能为空
     * daily.moonset 当天月落时间，可能为空
     * daily.moonPhase 月相名称
     * daily.moonPhaseIcon 月相图标代码，另请参考天气图标项目
     * daily.tempMax 预报当天最高温度
     * daily.tempMin 预报当天最低温度
     * daily.iconDay 预报白天天气状况的图标代码，另请参考天气图标项目
     * daily.textDay 预报白天天气状况文字描述，包括阴晴雨雪等天气状态的描述
     * daily.iconNight 预报夜间天气状况的图标代码，另请参考天气图标项目
     * daily.textNight 预报晚间天气状况文字描述，包括阴晴雨雪等天气状态的描述
     * daily.wind360Day 预报白天风向360角度
     * daily.windDirDay 预报白天风向
     * daily.windScaleDay 预报白天风力等级
     * daily.windSpeedDay 预报白天风速，公里/小时
     * daily.wind360Night 预报夜间风向360角度
     * daily.windDirNight 预报夜间当天风向
     * daily.windScaleNight 预报夜间风力等级
     * daily.windSpeedNight 预报夜间风速，公里/小时
     * daily.precip 预报当天总降水量，默认单位：毫米
     * daily.uvIndex 紫外线强度指数
     * daily.humidity 相对湿度，百分比数值
     * daily.pressure 大气压强，默认单位：百帕
     * daily.vis 能见度，默认单位：公里
     * daily.cloud 云量，百分比数值。可能为空
     * refer.sources 原始数据来源，或数据源说明，可能为空
     * refer.license 数据许可或版权声明，可能为空
     */
    @GetMapping(value = "/weather/{days}")
    JSONObject weatherFutureDays(
            @RequestParam(value = "key") String key,
            @RequestParam(value = "location") String location,
            @RequestParam(value = "lang") String lang,
            @RequestParam(value = "unit") String unit,
            @PathVariable(value = "days") String days);

    /**
     * 逐小时天气预报
     *
     * @param key      和风天气密钥
     * @param location (必选)需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标（十进制，最多支持小数点后两位），LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92
     * @param lang     多语言设置，请阅读多语言文档，了解我们的多语言是如何工作、如何设置以及数据是否支持多语言。
     * @param unit     数据单位设置，可选值包括unit=m（公制单位，默认）和unit=i（英制单位）。更多选项和说明参考度量衡单位。
     * @param hour     24h/72/168h
     * @return code 请参考状态码
     * updateTime 当前API的最近更新时间
     * fxLink 当前数据的响应式页面，便于嵌入网站或应用
     * hourly.fxTime 预报时间
     * hourly.temp 温度，默认单位：摄氏度
     * hourly.icon 天气状况的图标代码，另请参考天气图标项目
     * hourly.text 天气状况的文字描述，包括阴晴雨雪等天气状态的描述
     * hourly.wind360 风向360角度
     * hourly.windDir 风向
     * hourly.windScale 风力等级
     * hourly.windSpeed 风速，公里/小时
     * hourly.humidity 相对湿度，百分比数值
     * hourly.precip 当前小时累计降水量，默认单位：毫米
     * hourly.pop 逐小时预报降水概率，百分比数值，可能为空
     * hourly.pressure 大气压强，默认单位：百帕
     * hourly.cloud 云量，百分比数值。可能为空
     * hourly.dew 露点温度。可能为空
     * refer.sources 原始数据来源，或数据源说明，可能为空
     * refer.license 数据许可或版权声明，可能为空
     */
    @GetMapping(value = "/weather/{hour}")
    JSONObject weatherFutureHour(
            @RequestParam(value = "key") String key,
            @RequestParam(value = "location") String location,
            @RequestParam(value = "lang") String lang,
            @RequestParam(value = "unit") String unit,
            @PathVariable(value = "hour") String hour);

    /**
     * 天气灾害预警
     *
     * @param key      和风天气密钥
     * @param location (必选)需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标（十进制，最多支持小数点后两位），LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92
     * @param lang     多语言设置，请阅读多语言文档，了解我们的多语言是如何工作、如何设置以及数据是否支持多语言。
     * @return code 请参考状态码
     * updateTime 当前API的最近更新时间
     * fxLink 当前数据的响应式页面，便于嵌入网站或应用
     * warning.id 本条预警的唯一标识，可判断本条预警是否已经存在
     * warning.sender 预警发布单位，可能为空
     * warning.pubTime 预警发布时间
     * warning.title 预警信息标题
     * warning.startTime 预警开始时间，可能为空
     * warning.endTime 预警结束时间，可能为空
     * warning.status 预警信息的发布状态
     * warning.level 预警等级（已弃用），不要再使用这个字段，该字段已弃用，目前返回为空或未更新的值。请使用severity和severityColor代替
     * warning.severity 预警严重等级
     * warning.severityColor 预警严重等级颜色，可能为空
     * warning.type 预警类型ID
     * warning.typeName 预警类型名称
     * warning.urgency 预警信息的紧迫程度，可能为空
     * warning.certainty 预警信息的确定性，可能为空
     * warning.text 预警详细文字描述
     * warning.related 与本条预警相关联的预警ID，当预警状态为cancel或update时返回。可能为空
     * refer.sources 原始数据来源，或数据源说明，可能为空
     * refer.license 数据许可或版权声明，可能为空
     */
    @GetMapping(value = "/warning/now")
    JSONObject weatherWarningNow(
            @RequestParam(value = "key") String key,
            @RequestParam(value = "location") String location,
            @RequestParam(value = "lang") String lang);

    /**
     * 天气指数预报
     *
     * @param key      和风天气密钥
     * @param location (必选)需要查询地区的LocationID或以英文逗号分隔的经度,纬度坐标（十进制，最多支持小数点后两位），LocationID可通过GeoAPI获取。例如 location=101010100 或 location=116.41,39.92
     * @param type     (必选)生活指数的类型ID，包括洗车指数、穿衣指数、钓鱼指数等。可以一次性获取多个类型的生活指数，多个类型用英文,分割。例如type=3,5。具体生活指数的ID和等级参考天气指数信息。各项生活指数并非适用于所有城市。
     * @param lang     多语言设置，请阅读多语言文档，了解我们的多语言是如何工作、如何设置以及数据是否支持多语言。
     * @param days     1d/3d
     * @return code 请参考状态码
     * updateTime 当前API的最近更新时间
     * fxLink 当前数据的响应式页面，便于嵌入网站或应用
     * daily.date 预报日期
     * daily.type 生活指数类型ID
     * daily.name 生活指数类型的名称
     * daily.level 生活指数预报等级
     * daily.category 生活指数预报级别名称
     * daily.text 生活指数预报的详细描述，可能为空
     * refer.sources 原始数据来源，或数据源说明，可能为空
     * refer.license 数据许可或版权声明，可能为空
     */
    @GetMapping(value = "/indices/{days}")
    JSONObject weatherIndices(
            @RequestParam(value = "key") String key,
            @RequestParam(value = "location") String location,
            @RequestParam(value = "type") Integer type,
            @RequestParam(value = "lang") String lang,
            @PathVariable(value = "days") String days);

}
