// Package method 业务逻辑方法包，实现反馈相关的业务操作
package method

import (
	"context"

	"bsm/full/module/base/feedback/internal/impl"
	"bsm/full/module/base/feedback/internal/models"
	pb "bsm/full/module/base/feedback/pb"
	"git.apinb.com/bsm-sdk/core/service"
	"git.apinb.com/bsm-sdk/core/types"
	"git.apinb.com/bsm-sdk/core/utils"
)

// Add 添加新的反馈记录
// ctx: 上下文，包含用户认证信息
// in: 添加请求参数
// 返回: 添加结果，包含新创建的记录ID
func Add(ctx context.Context, in *pb.AddRequest) (reply *pb.AddReply, err error) {
	// 解析用户认证信息
	auth, err := service.ParseMetaCtx(ctx, nil)
	if err != nil {
		return nil, err
	}

	// 构建反馈记录
	record := &models.FeedbackItem{
		Std_IICUDS: types.Std_IICUDS{
			Identity: utils.UUID(), // 生成唯一标识
		},
		Std_Passport: types.Std_Passport{
			PassportID:       auth.ID,       // 用户ID
			PassportIdentity: auth.Identity, // 用户身份标识
		},
		UserName:    in.GetUserName(),                                              // 用户名
		Status:      in.GetStatus(),                                                // 状态
		Email:       in.GetEmail(),                                                 // 邮箱
		Phone:       in.GetPhone(),                                                 // 手机号
		Title:       in.GetTitle(),                                                 // 标题
		Content:     in.GetContent(),                                               // 内容
		Images:      make([]models.FeedbackImage, 0, len(in.GetImages())),          // 图片列表
		Accessories: make([]models.FeedbackAccessory, 0, len(in.GetAccessories())), // 附件列表
	}

	// 处理图片信息
	for _, v := range in.GetImages() {
		record.Images = append(record.Images, models.FeedbackImage{
			Std_IICUDS: types.Std_IICUDS{
				Identity: utils.UUID(), // 生成图片唯一标识
			},
			ItemIdentity: record.Identity, // 关联的反馈记录ID
			URL:          v.GetUrl(),      // 图片URL
		})
	}

	// 处理附件信息
	for _, v := range in.GetAccessories() {
		record.Accessories = append(record.Accessories, models.FeedbackAccessory{
			Std_IICUDS: types.Std_IICUDS{
				Identity: utils.UUID(), // 生成附件唯一标识
			},
			ItemIdentity: record.Identity, // 关联的反馈记录ID
			Title:        v.Title,         // 附件标题
			FilePath:     v.FilePath,      // 附件文件路径
		})
	}

	// 保存到数据库
	err = impl.DBService.Create(record).Error
	if err != nil {
		return nil, err
	}

	return &pb.AddReply{Identity: record.Identity}, nil
}
