package rag

import (
	"database/sql"
	"eta/eta_api/global"
	"eta/eta_api/utils"
	"fmt"
	"time"
)

type WechatPlatform struct {
	WechatPlatformId int       `gorm:"column:wechat_platform_id;type:int(10) UNSIGNED;primaryKey;not null;" description:"wechat_platform_id"`
	FakeId           string    `gorm:"column:fake_id;type:varchar(255);comment:公众号唯一id;" description:"fake_id"`                             // 公众号唯一id
	Nickname         string    `gorm:"column:nickname;type:varchar(255);comment:公众号名称;" description:"nickname"`                             // 公众号名称
	Alias            string    `gorm:"column:alias;type:varchar(255);comment:别名;" description:"alias"`                                      // 别名
	RoundHeadImg     string    `gorm:"column:round_head_img;type:varchar(255);comment:头像;" description:"round_head_img"`                    // 头像
	ServiceType      int       `gorm:"column:service_type;type:int(11);comment:类型;default:0;" description:"service_type"`                   // 类型
	Signature        string    `gorm:"column:signature;type:varchar(255);comment:签名;" description:"signature"`                              // 签名
	Verified         int       `gorm:"column:verified;type:int(11);comment:是否认证,0:未认证,1:已认证;这个我不确定,再核实下;default:0;" description:"verified"` // 是否认证,0:未认证,1:已认证;这个我不确定,再核实下
	ArticleLink      string    `gorm:"column:article_link;type:varchar(255);comment:添加公众时的文章链接;" description:"article_link"`                // 添加公众时的文章链接
	Enabled          int       `gorm:"column:enabled;type:tinyint(9);comment:是否启用,0:禁用,1:启用;default:1;" description:"enabled"`              // 是否启用,0:禁用,1:启用
	SysUserId        int       `gorm:"column:sys_user_id;type:int(9) UNSIGNED;comment:用户id;default:0;" description:"sys_user_id"`           // 用户id
	ModifyTime       time.Time `gorm:"column:modify_time;type:datetime;comment:最后一次修改时间;default:NULL;" description:"modify_time"`           // 最后一次修改时间
	CreateTime       time.Time `gorm:"column:create_time;type:datetime;comment:添加时间;default:NULL;" description:"create_time"`               // 添加时间
}

// TableName get sql table name.获取数据库表名
func (m *WechatPlatform) TableName() string {
	return "wechat_platform"
}

// WechatPlatformColumns get sql column name.获取数据库列名
var WechatPlatformColumns = struct {
	WechatPlatformID string
	FakeID           string
	Nickname         string
	Alias            string
	RoundHeadImg     string
	ServiceType      string
	Signature        string
	Verified         string
	ArticleLink      string
	Enabled          string
	SysUserID        string
	ModifyTime       string
	CreateTime       string
}{
	WechatPlatformID: "wechat_platform_id",
	FakeID:           "fake_id",
	Nickname:         "nickname",
	Alias:            "alias",
	RoundHeadImg:     "round_head_img",
	ServiceType:      "service_type",
	Signature:        "signature",
	Verified:         "verified",
	ArticleLink:      "article_link",
	Enabled:          "enabled",
	SysUserID:        "sys_user_id",
	ModifyTime:       "modify_time",
	CreateTime:       "create_time",
}

func (m *WechatPlatform) Create() (err error) {
	err = global.DbMap[utils.DbNameAI].Create(&m).Error

	return
}

func (m *WechatPlatform) Update(updateCols []string) (err error) {
	err = global.DbMap[utils.DbNameAI].Select(updateCols).Updates(&m).Error

	return
}

func (m *WechatPlatform) Del() (err error) {
	err = global.DbMap[utils.DbNameAI].Delete(&m).Error

	return
}

func (m *WechatPlatform) GetById(wechatPlatformId int) (item *WechatPlatform, err error) {
	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", WechatPlatformColumns.WechatPlatformID), wechatPlatformId).First(&item).Error

	return
}

func (m *WechatPlatform) GetByCondition(condition string, pars []interface{}) (item *WechatPlatform, err error) {
	sqlStr := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s`, m.TableName(), condition)
	err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).First(&item).Error

	return
}

func (m *WechatPlatform) GetListByCondition(condition string, pars []interface{}, startSize, pageSize int) (items []*WechatPlatform, err error) {
	sqlStr := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT ?,?`, m.TableName(), condition)
	pars = append(pars, startSize, pageSize)
	err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Find(&items).Error

	return
}

func (m *WechatPlatform) GetCountByCondition(condition string, pars []interface{}) (total int, err error) {
	var intNull sql.NullInt64
	sqlStr := fmt.Sprintf(`SELECT COUNT(1) total FROM %s WHERE 1=1 %s`, m.TableName(), condition)
	err = global.DbMap[utils.DbNameAI].Raw(sqlStr, pars...).Scan(&intNull).Error
	if err == nil && intNull.Valid {
		total = int(intNull.Int64)
	}

	return
}

func (m *WechatPlatform) GetPageListByCondition(condition string, pars []interface{}, startSize, pageSize int) (total int, items []*WechatPlatform, err error) {

	total, err = m.GetCountByCondition(condition, pars)
	if err != nil {
		return
	}
	if total > 0 {
		items, err = m.GetListByCondition(condition, pars, startSize, pageSize)
	}

	return
}

func (m *WechatPlatform) GetByFakeID(fakeId string) (item *WechatPlatform, err error) {
	err = global.DbMap[utils.DbNameAI].Where(fmt.Sprintf("%s = ?", WechatPlatformColumns.FakeID), fakeId).First(&item).Error

	return
}

// Add
// @Description: 添加一个新的公众号
// @author: Roc
// @receiver m
// @datetime 2025-03-04 17:48:30
// @param tagIdList []int
// @return err error
func (m *WechatPlatform) Add(tagIdList []int) (err error) {
	tx := global.DbMap[utils.DbNameAI].Begin()
	defer func() {
		if err != nil {
			_ = tx.Rollback()
		} else {
			_ = tx.Commit()
		}
	}()

	err = tx.Create(&m).Error
	if err != nil {
		return
	}

	// 标签与公众号关系
	if len(tagIdList) > 0 {
		addTagMappingList := make([]*WechatPlatformTagMapping, 0)

		for _, tagId := range tagIdList {
			addTagMappingList = append(addTagMappingList, &WechatPlatformTagMapping{
				WechatPlatformTagMappingId: 0,
				WechatPlatformId:           m.WechatPlatformId,
				TagId:                      tagId,
				ModifyTime:                 time.Now(),
				CreateTime:                 time.Now(),
			})
		}
		err = tx.CreateInBatches(addTagMappingList, utils.MultiAddNum).Error
		if err != nil {
			return
		}
	}

	// 用户与公众号关系
	userMapping := &WechatPlatformUserMapping{
		WechatPlatformUserMappingId: 0,
		WechatPlatformId:            m.WechatPlatformId,
		SysUserId:                   m.SysUserId,
		ModifyTime:                  time.Now(),
		CreateTime:                  time.Now(),
	}
	err = tx.Create(userMapping).Error

	return
}