package com.gzzm.lobster.skill;

import com.gzzm.lobster.common.IdGenerator;
import com.gzzm.platform.commons.crud.BaseNormalCrud;
import com.gzzm.platform.commons.crud.PageTableView;
import com.gzzm.platform.commons.crud.SimpleDialogView;
import net.cyan.arachne.annotation.Service;
import net.cyan.crud.OrderType;
import net.cyan.crud.annotation.Like;
import net.cyan.crud.view.components.CCheckbox;
import net.cyan.crud.view.components.CTextArea;
import net.cyan.nest.annotation.Inject;

import java.util.Date;

/**
 * SkillDefinitionCrud —— Skill 后台 CRUD / Skill admin CRUD (zmeg_new framework).
 *
 * <p>实体：{@link SkillDefinition}（表 {@code AI_SKILL_DEFINITION}，主键 {@code skillId}）。
 * <p>挂载地址 {@code /ai/admin/skill}，框架自动生成 list / add / update / delete 动作。
 * <p>REST 风格同域 API 见 {@code AdminSkillApi}（{@code /ai/api/admin/skills/*}），二者互不冲突。
 */
@Service(url = "/ai/admin/skill")
public class SkillDefinitionCrud extends BaseNormalCrud<SkillDefinition, String> {

    @Inject
    private SkillDefinitionDao skillDao;

    @Like
    private String name;

    public SkillDefinitionCrud() {
        setLog(true);
        addOrderBy("updateTime", OrderType.desc);
    }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    @Override
    public void initEntity(SkillDefinition entity) throws Exception {
        super.initEntity(entity);
        entity.setEnabled(Boolean.TRUE);
        entity.setVersion(1);
    }

    @Override
    public boolean beforeInsert() throws Exception {
        super.beforeInsert();
        SkillDefinition s = getEntity();
        if (s.getSkillId() == null || s.getSkillId().isEmpty()) {
            s.setSkillId(IdGenerator.prefixed("sk_"));
        }
        Date now = new Date();
        if (s.getCreateTime() == null) s.setCreateTime(now);
        s.setUpdateTime(now);
        if (s.getVersion() == null) s.setVersion(1);
        return true;
    }

    @Override
    public boolean beforeUpdate() throws Exception {
        super.beforeUpdate();
        SkillDefinition s = getEntity();
        s.setUpdateTime(new Date());
        // 版本号自增：CRUD 框架会合并 entity 字段，未显式置 null 的字段都会写入。
        // 这里读一次原值，避免前端没回传 version 时被清空。
        if (s.getVersion() == null) s.setVersion(1);
        else s.setVersion(s.getVersion() + 1);
        return true;
    }

    @Override
    protected Object createListView() throws Exception {
        PageTableView view = new PageTableView();

        view.addComponent("名称", "name");

        view.addColumn("Skill ID", "skillId").setWidth("180");
        view.addColumn("名称", "name").setWidth("200");
        view.addColumn("作用域", "scope").setWidth("80");
        view.addColumn("运行形态", "runtimeKind").setWidth("120");
        view.addColumn("触发条件", "triggerCondition");
        view.addColumn("版本", "version").setWidth("60");
        view.addColumn("启用", "(enabled==null||enabled)?'是':'否'").setWidth("60");
        view.addColumn("更新时间", "updateTime").setWidth("140");

        view.defaultInit();

        return view;
    }

    @Override
    protected Object createShowView() throws Exception {
        SimpleDialogView view = new SimpleDialogView();

        view.addComponent("名称", "name");
        view.addComponent("作用域", "scope");
        view.addComponent("组织 ID", "orgId");
        view.addComponent("触发条件", "triggerCondition");
        view.addComponent("运行形态", "runtimeKind");
        view.addComponent("指导正文 (markdown)", new CTextArea("guidance"));
        view.addComponent("中间状态 (JSON array)", new CTextArea("intermediateStatesJson"));
        view.addComponent("查询范围 (JSON array)", new CTextArea("queryScopesJson"));
        view.addComponent("resume 检查 (JSON array)", new CTextArea("resumeChecksJson"));
        view.addComponent("完成条件 (JSON array)", new CTextArea("completionRequirementsJson"));
        view.addComponent("启用", new CCheckbox("enabled"));

        view.addDefaultButtons();

        return view;
    }
}
