// Package category 提供分类相关的业务逻辑处理
// 包括分类的创建、修改、删除、查询等功能
package category

import (
	"context"
	"time"

	"bsm/full/module/base/cms/internal/impl"
	"bsm/full/module/base/cms/internal/models"
	pb "bsm/full/module/base/cms/pb"
	"git.apinb.com/bsm-sdk/core/errcode"
	"git.apinb.com/bsm-sdk/core/printer"
	"git.apinb.com/bsm-sdk/core/service"
	"git.apinb.com/bsm-sdk/core/utils"
	"git.apinb.com/bsm-sdk/core/vars"
)

// Create 创建新分类
// 验证用户身份和分类数据，创建分类记录
// 参数:
//   - ctx: 请求上下文，包含用户身份信息
//   - in: 分类数据，包含标题、父级ID、介绍等
//
// 返回:
//   - reply: 操作结果，包含分类ID和时间戳
//   - err: 错误信息
func Create(ctx context.Context, in *pb.CategoryItem) (reply *pb.StatusReply, err error) {
	// 解析请求上下文，验证用户身份
	_, err = service.ParseMetaCtx(ctx, nil)
	if err != nil {
		return nil, err
	}

	// 验证分类标题不能为空且长度不超过255字符
	if in.GetSiteIdentity() == "" || in.GetTitle() == "" || len(in.GetTitle()) > 255 {
		return nil, errcode.ErrInvalidArgument
	}

	// 构建分类数据模型
	data := models.CmsCategory{
		SiteIdentity: in.GetSiteIdentity(),
		ParentId:     uint(in.GetParentId()), // 父级分类ID，0表示顶级分类
		CategoryKey:  in.GetCategoryKey(),    // 分类键值，用于URL等
		Title:        in.GetTitle(),          // 分类标题
		CoverPath:    in.GetCoverPath(),      // 分类封面图片路径
		Intro:        in.GetIntro(),          // 分类介绍
	}

	// 生成分类唯一标识
	data.Identity = utils.UUID()

	// 保存分类数据到数据库
	if err := impl.DBService.Model(&models.CmsCategory{}).Create(&data).Error; err != nil {
		printer.Error(err.Error())
		return nil, errcode.ErrDB
	}

	// 返回成功响应
	return &pb.StatusReply{
		Code:    0,
		Message: vars.OK,
		Details: data.Identity,
		Timeseq: time.Now().UnixMilli(),
	}, nil
}
