package sys_login_log

import (
	"context"

	"kami/internal/dao"
	"kami/internal/model"
	"kami/internal/model/entity"
	"kami/internal/service"
	"kami/utility/config"
	"kami/utility/utils"

	"github.com/gogf/gf/v2/os/grpool"
	"github.com/gogf/gf/v2/os/gtime"
)

func init() {
	service.RegisterSysLoginLog(New())
}

func New() *sSysLoginLog {
	return &sSysLoginLog{
		Pool: grpool.New(100),
	}
}

type sSysLoginLog struct {
	Pool *grpool.Pool
}

func (s *sSysLoginLog) Invoke(ctx context.Context, data *model.LoginLogParams) {
	_ = s.Pool.Add(
		ctx,
		func(ctx context.Context) {
			// 写入日志数据
			service.SysUser().LoginLog(ctx, data)
		},
	)
}

// QueryLoginLogs 查询登录日志列表
func (s *sSysLoginLog) QueryLoginLogs(ctx context.Context, input *model.LoginLogQueryInput) (total int, list []*entity.V1SysUserLoginLog, err error) {
	m := dao.V1SysUserLoginLog.Ctx(ctx).DB(config.GetDatabaseV1())

	// 条件过滤
	if input.UserId != "" {
		m = m.Where(dao.V1SysUserLoginLog.Columns().UserId, input.UserId)
	}

	if input.LoginName != "" {
		m = m.Where(dao.V1SysUserLoginLog.Columns().LoginName, input.LoginName)
	}

	if input.Status > 0 {
		m = m.Where(dao.V1SysUserLoginLog.Columns().Status, input.Status)
	}

	// 时间范围查询
	if input.StartTime != "" {
		startTime, err2 := gtime.StrToTime(input.StartTime)
		if err2 == nil {
			m = m.WhereGTE(dao.V1SysUserLoginLog.Columns().CreatedAt, startTime)
		}
	}

	if input.EndTime != "" {
		endTime, err2 := gtime.StrToTime(input.EndTime)
		if err2 == nil {
			// 时间范围需要到当天的结束时刻
			m = m.WhereLTE(dao.V1SysUserLoginLog.Columns().CreatedAt, endTime.AddDate(0, 0, 1).StartOfDay())
		}
	}

	// 排序：按创建时间倒序
	m = m.Order(dao.V1SysUserLoginLog.Columns().CreatedAt + " DESC")

	// 分页查询
	list = make([]*entity.V1SysUserLoginLog, 0)
	err = m.Page(input.Current, input.PageSize).ScanAndCount(&list, &total, true)
	err = utils.HandleNoRowsError(err)
	return
}

// GetLoginLogDetail 获取登录日志详情
func (s *sSysLoginLog) GetLoginLogDetail(ctx context.Context, id uint) (res *entity.V1SysUserLoginLog, err error) {
	m := dao.V1SysUserLoginLog.Ctx(ctx).DB(config.GetDatabaseV1())
	err = m.WherePri(id).Scan(&res)
	err = utils.HandleNoRowsError(err)
	return
}

//func (s *sSysLoginLog) List(ctx context.Context, req *systemV1.LoginLogSearchReq) (res *systemV1.LoginLogSearchRes, err error) {
//	res = new(systemV1.LoginLogSearchRes)
//	if req.PageNum == 0 {
//		req.PageNum = 1
//	}
//	res.CurrentPage = req.PageNum
//	if req.PageSize == 0 {
//		req.PageSize = consts.PageSize
//	}
//	m := dao.SysLoginLog.Ctx(ctx)
//	order := "info_id DESC"
//	if req.LoginName != "" {
//		m = m.Where("login_name like ?", "%"+req.LoginName+"%")
//	}
//	if req.Status != "" {
//		m = m.Where("status", gconv.Int(req.Status))
//	}
//	if req.Ipaddr != "" {
//		m = m.Where("ipaddr like ?", "%"+req.Ipaddr+"%")
//	}
//	if req.LoginLocation != "" {
//		m = m.Where("login_location like ?", "%"+req.LoginLocation+"%")
//	}
//	if len(req.DateRange) != 0 {
//		m = m.Where("login_time >=? AND login_time <=?", req.DateRange[0], req.DateRange[1])
//	}
//	if req.SortName != "" {
//		if req.SortOrder != "" {
//			order = req.SortName + " " + req.SortOrder
//		} else {
//			order = req.SortName + " DESC"
//		}
//	}
//	err = g.Try(ctx, func(ctx context.Context) {
//		res.Total, err = m.Count()
//		liberr.ErrIsNil(ctx, err, "获取日志失败")
//		err = m.Page(req.PageNum, req.PageSize).Order(order).Scan(&res.List)
//		liberr.ErrIsNil(ctx, err, "获取日志数据失败")
//	})
//	return
//}
//
//func (s *sSysLoginLog) DeleteLoginLogByIds(ctx context.Context, ids []int) (err error) {
//	err = g.Try(ctx, func(ctx context.Context) {
//		_, err = dao.SysLoginLog.Ctx(ctx).Delete("info_id in (?)", ids)
//		liberr.ErrIsNil(ctx, err, "删除失败")
//	})
//	return
//}
//
//func (s *sSysLoginLog) ClearLoginLog(ctx context.Context) (err error) {
//	err = g.Try(ctx, func(ctx context.Context) {
//		_, err = g.DB().Ctx(ctx).Exec(ctx, "truncate "+dao.SysLoginLog.Table())
//		liberr.ErrIsNil(ctx, err, "清除失败")
//	})
//	return
//}
