package com.ylx.massage.enums;

import com.ylx.common.utils.StringUtils;
import lombok.Getter;
import org.apache.commons.compress.utils.Lists;

import java.util.ArrayList;
import java.util.List;

/**
 * 项目分类枚举
 * <p>
 * 定义不同服务项目的分类，用于跨项目互斥控制。
 * 确保技师在同一时间段内只能服务一个项目，实现服务时间的互斥性。
 * </p>
 *
 * @author ylx
 * @version 1.0
 * @since 2024
 */
@Getter
public enum ProjectCategoryEnum {

    /**
     * 按摩类项目
     * 包括：全身按摩、足疗、精油开背等按摩服务
     */
    MASSAGE(1, "按摩类"),

    /**
     * 陪聊类项目
     * 包括：陪聊、陪玩、陪伴等非按摩类服务
     * 预留功能，用于未来扩展
     */
    COMPANION(2, "陪聊类"),

    /**
     * 其他类项目
     * 预留分类，用于未来扩展其他类型的服务项目
     */
    OTHER(99, "其他类");

    private final Integer code;
    private final String info;

    ProjectCategoryEnum(Integer code, String info) {
        this.code = code;
        this.info = info;
    }

    /**
     * 获取所有项目分类枚举列表
     * <p>
     * 用于前端展示项目分类选项。
     * </p>
     *
     * @return List<Enumproject> 项目分类枚举列表
     */
    public static List<Enumproject> getProjectCategoryEnum() {
        ArrayList<Enumproject> objects = Lists.newArrayList();
        for (ProjectCategoryEnum value : ProjectCategoryEnum.values()) {
            Enumproject enumproject = new Enumproject();
            enumproject.setInfo(value.getInfo());
            enumproject.setCode(value.getCode());
            objects.add(enumproject);
        }
        return objects;
    }

    /**
     * 根据代码获取项目分类描述
     * <p>
     * 用于将数据库中的分类代码转换为可读的描述文本。
     * </p>
     *
     * @param code 项目分类代码
     * @return String 项目分类描述，如果代码无效则返回空字符串
     */
    public static String getDescByCode(Integer code) {
        if (code == null) {
            return StringUtils.EMPTY;
        }

        for (ProjectCategoryEnum value : ProjectCategoryEnum.values()) {
            if (value.getCode().equals(code)) {
                return value.getInfo();
            }
        }
        return StringUtils.EMPTY;
    }

    /**
     * 根据代码获取项目分类枚举
     * <p>
     * 用于获取指定代码对应的枚举对象。
     * </p>
     *
     * @param code 项目分类代码
     * @return ProjectCategoryEnum 项目分类枚举，如果代码无效则返回null
     */
    public static ProjectCategoryEnum getByCode(Integer code) {
        if (code == null) {
            return null;
        }

        for (ProjectCategoryEnum value : ProjectCategoryEnum.values()) {
            if (value.getCode().equals(code)) {
                return value;
            }
        }
        return null;
    }

    /**
     * 验证项目分类代码是否有效
     * <p>
     * 检查给定的分类代码是否在预定义的分类枚举中。
     * </p>
     *
     * @param code 项目分类代码
     * @return boolean 如果分类代码有效返回true，否则返回false
     */
    public static boolean isValidCode(Integer code) {
        if (code == null) {
            return false;
        }

        for (ProjectCategoryEnum value : ProjectCategoryEnum.values()) {
            if (value.getCode().equals(code)) {
                return true;
            }
        }
        return false;
    }
}
