package db

import (
	"errors"
	"strings"

	"gorm.io/gorm"
)

type ChatType uint

const Q ChatType = 1
const A ChatType = 2

type Chat struct {
	gorm.Model
	Username      string   `gorm:"type:varchar(50);not null;comment:'用户名'" json:"username"`        // 用户名
	Source        string   `gorm:"type:varchar(50);comment:'用户来源:群聊名字,私聊'" json:"source"`          // 对话来源
	ChatType      ChatType `gorm:"type:tinyint(1);default:1;comment:'类型:1问, 2答'" json:"chat_type"` // 状态
	ParentContent uint     `gorm:"default:0;comment:'父消息编号(编号为0时表示为首条)'" json:"parent_content"`
	Content       string   `gorm:"type:varchar(128);comment:'内容'" json:"content"` // 问题或回答的内容
}

type ChatListReq struct {
	Username string `json:"username" form:"username"`
	Source   string `json:"source" form:"source"`
}

// Add 添加资源
func (c Chat) Add() (uint, error) {
	err := DB.Create(&c).Error
	return c.ID, err
}

// Find 获取单个资源
func (c Chat) Find(filter map[string]interface{}, data *Chat) error {
	return DB.Where(filter).First(&data).Error
}

// List 获取数据列表
func (c Chat) List(req ChatListReq) ([]*Chat, error) {
	var list []*Chat
	db := DB.Model(&Chat{}).Order("created_at ASC")

	userName := strings.TrimSpace(req.Username)
	if userName != "" {
		db = db.Where("username = ?", userName)
	}
	source := strings.TrimSpace(req.Source)
	if source != "" {
		db = db.Where("source = ?", source)
	}

	err := db.Find(&list).Error
	return list, err
}

// Exist 判断资源是否存在
func (c Chat) Exist(filter map[string]interface{}) bool {
	var dataObj Chat
	err := DB.Where(filter).First(&dataObj).Error
	return !errors.Is(err, gorm.ErrRecordNotFound)
}