package com.yolo.keyboard.dal.dataobject.appversions;

import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yolo.keyboard.framework.mybatis.core.type.JsonbTypeHandler;
import com.yolo.keyboard.framework.tenant.core.aop.TenantIgnore;
import lombok.*;

import java.time.LocalDateTime;

/**
 * App 版本发布与更新检查表：区分 Android/iOS、渠道，支持最低支持版本与强更策略。 DO
 *
 * @author ziin
 */
@TableName(value = "keyboard_app_versions", autoResultMap = true)
@KeySequence("keyboard_app_versions_id_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库，可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TenantIgnore
public class AppVersionsDO  {

    /**
     * 主键，自增版本记录ID。
     */
    @TableId
    private Long id;
    /**
     * 应用标识（支持多App/多包名场景）；单App可固定为 main。
     */
    private String appId;
    /**
     * 平台：android 或 ios（用 CHECK 约束限制取值）。
     */
    private String platform;
    /**
     * 渠道标识：如 official / huawei / xiaomi / testflight 等，用于区分不同分发包。
     */
    private String channel;
    /**
     * 展示用版本号（语义版本字符串），如 1.2.3。
     */
    private String versionName;
    /**
     * 比较用版本号（整数递增）：Android 对应 versionCode；iOS 建议维护同样的递增值以便比较。
     */
    private Long versionCode;
    /**
     * iOS 可选构建号（例如 CFBundleVersion），通常为字符串；用于追溯构建或与CI编号对齐。
     */
    private String buildNumber;
    /**
     * 最低支持版本号（整数）：客户端 version_code 低于该值必须更新/可拒绝继续使用。
     */
    private Long minSupportedCode;
    /**
     * 是否强制更新：当客户端未达到最新版本且此字段为 true，可要求强更（即使 >= min_supported_code）。
     */
    private Boolean isForceUpdate;
    /**
     * 是否生效：true 表示该版本记录可用于对外更新检查；false 用于下架/撤回。
     */
    private Boolean isActive;
    /**
     * 更新说明（展示给用户的版本更新内容）。
     */
    private String releaseNotes;
    /**
     * 下载链接：Android 可为 apk 直链/市场 scheme；iOS 通常为 App Store 链接或统一跳转页。
     */
    private String downloadUrl;
    /**
     * 应用市场/商店页面链接（可选，若 download_url 已覆盖可不填）。
     */
    private String storeUrl;
    /**
     * 扩展元数据（JSON）：如包大小、md5、签名信息、最低系统版本等。
     */
    @TableField(typeHandler = JsonbTypeHandler.class)
    private Object metadata;
    /**
     * 发布时间（对外宣布/上线时间），用于展示与排序。
     */
    private LocalDateTime releasedAt;
    /**
     * 记录创建时间。
     */
    private LocalDateTime createdAt;
    /**
     * 记录更新时间（建议配合触发器自动维护）。
     */
    private LocalDateTime updatedAt;


}