package user

import (
	context "context"
	"time"

	"github.com/tidbcloud/account/commons/database"
	"github.com/tidbcloud/account/internel/dao"

	"github.com/tidbcloud/account/commons/config"

	"github.com/tidbcloud/account/internel/dao/entity"
	userDao "github.com/tidbcloud/account/internel/dao/user"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
)

func (s *UserSvc) GenUserInviteToken(ctx context.Context, inviteUserToken entity.UserInviteToken, period time.Duration) (*userDao.CreateInviteTokenResp, error) {
	tilog.Info(ctx, "userSvc GenUserInviteToken ", zap.Any("inviteUserToken", inviteUserToken))
	return dao.GetDaoHub().User.GenUserInviteToken(ctx, database.DBConn.DB.WithContext(ctx), inviteUserToken, period)
}
func (s *UserSvc) NewUserInviteToken(ctx context.Context, inviteUserToken entity.UserInviteToken, period time.Duration) (*userDao.CreateInviteTokenResp, error) {
	tilog.Info(ctx, "userSvc NewUserInviteToken ", zap.Any("inviteUserToken", inviteUserToken))
	return dao.GetDaoHub().User.NewUserInviteToken(ctx, database.DBConn.DB.WithContext(ctx), inviteUserToken, period)
}

func (s *UserSvc) ValidateUserInviteToken(ctx context.Context, token string, isDelete bool) (*entity.UserInviteToken, error) {
	tilog.Info(ctx, "userSvc ValidateUserInviteToken ", zap.Any("token", token))
	return dao.GetDaoHub().User.ValidateUserInviteToken(ctx, database.DBConn.DB.WithContext(ctx), token, isDelete)
}

func (s *UserSvc) ValidateUserInviteTokenIgnoreEmail(ctx context.Context, token string, isDelete bool) (*entity.UserInviteToken, error) {
	tilog.Info(ctx, "userSvc ValidateUserInviteToken ", zap.Any("token", token))
	return dao.GetDaoHub().User.ValidateUserInviteTokenIgnoreEmail(ctx, database.DBConn.DB.WithContext(ctx), token, isDelete)
}
func (s *UserSvc) DeleteUserInviteToken(ctx context.Context, token string) error {
	tilog.Info(ctx, "userSvc DeleteUserInviteToken ", zap.Any("token", token))
	return dao.GetDaoHub().User.DeleteUserInviteToken(ctx, database.DBConn.DB.WithContext(ctx), token)
}

func (s *UserSvc) CreateInviteToken(ctx context.Context, orgId uint64, email string, method string) (*userDao.CreateInviteTokenResp, error) {
	var inviterToken entity.UserInviteToken
	var period time.Duration
	if method == config.MspCreateKey {
		inviterToken = entity.UserInviteToken{
			Method:    method,
			Email:     email,
			TenantID:  entity.ID(orgId),
			BeginAt:   time.Now(),
			IsOneTime: true,
		}
		// expire 7 day
		period = 7 * 24 * time.Hour
	} else if method == config.MspCustomerRegister || method == config.ResaleCustomerRegister {
		inviterToken = entity.UserInviteToken{
			Method:    method,
			Email:     email,
			TenantID:  entity.ID(orgId),
			BeginAt:   time.Now(),
			IsOneTime: true,
		}
		// expire 1 day
		period = 1 * 24 * time.Hour
	}
	tokenResp, err := s.NewUserInviteToken(ctx, inviterToken, period)
	if err != nil {
		tilog.Error(ctx, "GenUserInviteToken err", zap.Any("inviterToken", inviterToken), zap.Error(err))
		return nil, err
	}
	return tokenResp, nil
}
