package com.qqchen.deploy.backend.deploy.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 团队开发模式枚举
 *
 * @author qqchen
 * @since 2025-12-04
 */
@Getter
public enum DevelopmentModeEnum {

    /**
     * 标准模式
     * - 直接在客户环境/目标环境开发
     * - 源码直接提交到客户Git
     * - 无需内外网同步
     */
    STANDARD(
        "STANDARD",
        "标准模式",
        "单仓库直接开发部署",
        false,
        false
    ),

    /**
     * 同步模式
     * - 内网Git开发
     * - 源码定期同步到客户Git
     * - 需要Git同步检测
     */
    SYNC_MODE(
        "SYNC_MODE",
        "同步模式",
        "源码内外网同步",
        true,
        true
    ),

    /**
     * 制品交付模式
     * - 内网开发编译
     * - 只交付JAR/WAR/镜像等制品
     * - 客户无源码访问权限
     * - 需要制品版本管理
     */
    ARTIFACT_DELIVERY(
        "ARTIFACT_DELIVERY",
        "制品交付模式",
        "仅交付编译制品，无源码",
        true,
        false
    );

    /**
     * 编码
     */
    @JsonValue
    private final String code;

    /**
     * 显示名称
     */
    private final String name;

    /**
     * 描述
     */
    private final String description;

    /**
     * 是否内网开发
     */
    private final boolean internalDevelopment;

    /**
     * 是否需要Git同步检测
     */
    private final boolean requiresGitSyncCheck;

    DevelopmentModeEnum(String code, String name, String description, boolean internalDevelopment, boolean requiresGitSyncCheck) {
        this.code = code;
        this.name = name;
        this.description = description;
        this.internalDevelopment = internalDevelopment;
        this.requiresGitSyncCheck = requiresGitSyncCheck;
    }

    /**
     * 根据编码查找对应的枚举
     *
     * @param code 开发模式编码
     * @return 对应的枚举实例
     * @throws IllegalArgumentException 当找不到对应的枚举值时抛出
     */
    public static DevelopmentModeEnum fromValue(String code) {
        for (DevelopmentModeEnum mode : values()) {
            if (mode.code.equals(code)) {
                return mode;
            }
        }
        throw new IllegalArgumentException("Unknown DevelopmentMode code: " + code);
    }
}
