package repository

import (
	"ai-gateway/common/utils"
	"context"
	"gorm.io/gorm"
	"time"
)

// FThirdAgentInfoDO 三方代理 信息表
type FThirdAgentInfoDO struct {
	Id         uint64    `gorm:"column:id;type:bigint(20) unsigned;primary_key;AUTO_INCREMENT" json:"id"`
	Sn         string    `gorm:"column:sn;type:varchar(64);comment:sn" json:"sn"`
	Name       string    `gorm:"column:name;type:varchar(64);comment:名称" json:"name"`
	Account    string    `gorm:"column:account;type:varchar(64);comment:帐号" json:"account"`
	Pwd        string    `gorm:"column:pwd;type:varchar(128);comment:密码" json:"pwd"`
	Iphone     string    `gorm:"column:iphone;type:varchar(32);comment:联系方式" json:"iphone"`
	Email      string    `gorm:"column:email;type:varchar(64);comment:email" json:"email"`
	Remark     string    `gorm:"column:remark;type:varchar(64);comment:备注" json:"remark"`
	Status     int       `gorm:"column:status;type:tinyint(1) unsigned;default:1;comment:是否有效。0:否;1:是;NOT NULL" json:"status"`
	Deleted    uint      `gorm:"column:deleted;type:tinyint(1) unsigned;default:0;comment:逻辑删除。 0:未删除;1:已删除;NOT NULL" json:"deleted"`
	CreateTime time.Time `gorm:"column:create_time;type:timestamp;default:CURRENT_TIMESTAMP;comment:创建时间;NOT NULL" json:"create_time"`
	UpdateTime time.Time `gorm:"column:update_time;type:timestamp;default:CURRENT_TIMESTAMP;comment:更新时间;NOT NULL" json:"update_time"`
}

func (m *FThirdAgentInfoDO) TableName() string {
	return "f_third_agent_info"
}

type thirdAgentInfoRepositoryImpl struct {
}

func (thirdAgentInfoRepositoryImpl) QueryPage(ctx context.Context, page, size int) *[]FThirdAgentInfoDO {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}
	offset := (page - 1) * size
	offset = utils.If(offset >= 0, offset, 0)
	var dataList []FThirdAgentInfoDO
	sqlErr := db.Model(&FThirdAgentInfoDO{}).Order("id DESC").Limit(size).Offset(offset).Find(&dataList).Error
	if sqlErr != nil {
		return nil
	}

	if len(dataList) == 0 {
		return nil
	}

	return &dataList

}

func (thirdAgentInfoRepositoryImpl) FindById(ctx context.Context, id uint64) *FThirdAgentInfoDO {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	var model FThirdAgentInfoDO
	sqlErr := db.Where("id=?", id).First(&model).Error
	if sqlErr != nil {
		return nil
	}

	return &model
}

func (thirdAgentInfoRepositoryImpl) Count(ctx context.Context) int64 {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	var total int64
	sqlErr := db.Model(&FThirdAgentInfoDO{}).Select("count(*)").First(&total).Error
	if sqlErr != nil {
		return 0
	}

	return total
}

func (thirdAgentInfoRepositoryImpl) Create(ctx context.Context, data *FThirdAgentInfoDO) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	//保存数据
	return db.Create(data).Error
}

func (thirdAgentInfoRepositoryImpl) UpdateById(ctx context.Context, data FThirdAgentInfoDO) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	//更新数据
	return db.Updates(&data).Error

}

func (thirdAgentInfoRepositoryImpl) UpdateStatusById(ctx context.Context, id uint64, status int, operator string) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	data := FThirdAgentInfoDO{}
	sqlErr := db.Model(&data).
		Select("status").
		Where("id=?", id).
		Updates(FThirdAgentInfoDO{Status: status}).Error
	if sqlErr != nil {
		return sqlErr
	}

	return nil
}

func (thirdAgentInfoRepositoryImpl) deleteById(ctx context.Context, id uint64, operator string) error {
	db, ok := ctx.Value("db").(*gorm.DB)
	if !ok {
		db = Db
	}

	data := FThirdAgentInfoDO{}
	sqlErr := db.Model(&data).
		Select("deleted").
		Where("id=?", id).
		Updates(FThirdAgentInfoDO{Deleted: 1}).Error
	if sqlErr != nil {
		return sqlErr
	}

	return nil
}