package system

import (
	"context"
	"errors"
	"time"
)

type APIToken struct {
	ID          uint
	CreatedAt   time.Time
	UpdatedAt   time.Time
	UserID      uint
	AuthorityID uint
	Token       string
	Status      bool
	ExpiresAt   time.Time
	Remark      string
	User        *User
}

type APITokenRepo interface {
	UserHasAuthority(context.Context, uint, uint) (*User, bool, error)
	CreateAPIToken(context.Context, *APIToken) error
	ListAPITokens(context.Context, int, int, uint, *bool) ([]*APIToken, int64, error)
	DisableAPIToken(context.Context, uint) (string, error)
	DisableAndBlacklistAPIToken(context.Context, uint) error
	BlacklistToken(context.Context, string) error
	IsTokenDisabled(context.Context, string) (bool, error)
}

type TokenUsecase struct{ APITokenRepo }

func NewTokenUsecase(repo APITokenRepo) *TokenUsecase {
	return &TokenUsecase{APITokenRepo: repo}
}

func (uc *TokenUsecase) PrepareAPIToken(ctx context.Context, userID, authorityID uint, days int) (*User, time.Duration, error) {
	user, allowed, err := uc.UserHasAuthority(ctx, userID, authorityID)
	if err != nil {
		return nil, 0, err
	}
	if !allowed {
		return nil, 0, errors.New("用户不具备该角色权限")
	}
	duration := time.Duration(days) * 24 * time.Hour
	if days == -1 {
		duration = 100 * 365 * 24 * time.Hour
	}
	return user, duration, nil
}

func (uc *TokenUsecase) DisableToken(ctx context.Context, id uint) error {
	return uc.APITokenRepo.DisableAndBlacklistAPIToken(ctx, id)
}
