package com.yolo.keyboard.controller.admin.appversions.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.idev.excel.annotation.*;

@Schema(description = "管理后台 - App 版本发布与更新检查表：区分 Android/iOS、渠道，支持最低支持版本与强更策略。 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AppVersionsRespVO {

    @Schema(description = "主键，自增版本记录ID。", requiredMode = Schema.RequiredMode.REQUIRED, example = "25012")
    @ExcelProperty("主键，自增版本记录ID。")
    private Long id;

    @Schema(description = "应用标识（支持多App/多包名场景）；单App可固定为 main。", requiredMode = Schema.RequiredMode.REQUIRED, example = "10064")
    @ExcelProperty("应用标识（支持多App/多包名场景）；单App可固定为 main。")
    private String appId;

    @Schema(description = "平台：android 或 ios（用 CHECK 约束限制取值）。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("平台：android 或 ios（用 CHECK 约束限制取值）。")
    private String platform;

    @Schema(description = "渠道标识：如 official / huawei / xiaomi / testflight 等，用于区分不同分发包。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("渠道标识：如 official / huawei / xiaomi / testflight 等，用于区分不同分发包。")
    private String channel;

    @Schema(description = "展示用版本号（语义版本字符串），如 1.2.3。", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
    @ExcelProperty("展示用版本号（语义版本字符串），如 1.2.3。")
    private String versionName;

    @Schema(description = "比较用版本号（整数递增）：Android 对应 versionCode；iOS 建议维护同样的递增值以便比较。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("比较用版本号（整数递增）：Android 对应 versionCode；iOS 建议维护同样的递增值以便比较。")
    private Long versionCode;

    @Schema(description = "iOS 可选构建号（例如 CFBundleVersion），通常为字符串；用于追溯构建或与CI编号对齐。")
    @ExcelProperty("iOS 可选构建号（例如 CFBundleVersion），通常为字符串；用于追溯构建或与CI编号对齐。")
    private String buildNumber;

    @Schema(description = "最低支持版本号（整数）：客户端 version_code 低于该值必须更新/可拒绝继续使用。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("最低支持版本号（整数）：客户端 version_code 低于该值必须更新/可拒绝继续使用。")
    private Long minSupportedCode;

    @Schema(description = "是否强制更新：当客户端未达到最新版本且此字段为 true，可要求强更（即使 >= min_supported_code）。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("是否强制更新：当客户端未达到最新版本且此字段为 true，可要求强更（即使 >= min_supported_code）。")
    private Boolean isForceUpdate;

    @Schema(description = "是否生效：true 表示该版本记录可用于对外更新检查；false 用于下架/撤回。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("是否生效：true 表示该版本记录可用于对外更新检查；false 用于下架/撤回。")
    private Boolean isActive;

    @Schema(description = "更新说明（展示给用户的版本更新内容）。")
    @ExcelProperty("更新说明（展示给用户的版本更新内容）。")
    private String releaseNotes;

    @Schema(description = "下载链接：Android 可为 apk 直链/市场 scheme；iOS 通常为 App Store 链接或统一跳转页。", example = "https://www.iocoder.cn")
    @ExcelProperty("下载链接：Android 可为 apk 直链/市场 scheme；iOS 通常为 App Store 链接或统一跳转页。")
    private String downloadUrl;

    @Schema(description = "应用市场/商店页面链接（可选，若 download_url 已覆盖可不填）。", example = "https://www.iocoder.cn")
    @ExcelProperty("应用市场/商店页面链接（可选，若 download_url 已覆盖可不填）。")
    private String storeUrl;

    @Schema(description = "扩展元数据（JSON）：如包大小、md5、签名信息、最低系统版本等。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("扩展元数据（JSON）：如包大小、md5、签名信息、最低系统版本等。")
    private Object metadata;

    @Schema(description = "发布时间（对外宣布/上线时间），用于展示与排序。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("发布时间（对外宣布/上线时间），用于展示与排序。")
    private LocalDateTime releasedAt;

    @Schema(description = "记录创建时间。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("记录创建时间。")
    private LocalDateTime createdAt;

    @Schema(description = "记录更新时间（建议配合触发器自动维护）。", requiredMode = Schema.RequiredMode.REQUIRED)
    @ExcelProperty("记录更新时间（建议配合触发器自动维护）。")
    private LocalDateTime updatedAt;

}