package activity

import (
	"context"
	"time"

	"bindbox-game/internal/pkg/logger"
	"bindbox-game/internal/repository/mysql"
	"bindbox-game/internal/repository/mysql/dao"
	"bindbox-game/internal/repository/mysql/model"
)

type Service interface {
	CreateActivity(ctx context.Context, in CreateActivityInput) (*model.Activities, error)
	ModifyActivity(ctx context.Context, id int64, in ModifyActivityInput) error
	DeleteActivity(ctx context.Context, id int64) error
	GetActivity(ctx context.Context, id int64) (*model.Activities, error)
	ListActivities(ctx context.Context, in ListActivitiesInput) (items []*model.Activities, total int64, err error)

	ListIssues(ctx context.Context, activityID int64, page, pageSize int) (items []*model.ActivityIssues, total int64, err error)
	CreateIssue(ctx context.Context, activityID int64, in CreateIssueInput) (*model.ActivityIssues, error)
	ModifyIssue(ctx context.Context, issueID int64, in ModifyIssueInput) error
	DeleteIssue(ctx context.Context, issueID int64) error

	CreateIssueRewards(ctx context.Context, issueID int64, rewards []CreateRewardInput) error
	ListIssueRewards(ctx context.Context, issueID int64) (items []*model.ActivityRewardSettings, err error)
	ModifyIssueReward(ctx context.Context, rewardID int64, in ModifyRewardInput) error
	DeleteIssueReward(ctx context.Context, rewardID int64) error

	ListDrawLogs(ctx context.Context, issueID int64, page, pageSize int) (items []*model.ActivityDrawLogs, total int64, err error)

	GetCategoryNames(ctx context.Context, ids []int64) (map[int64]string, error)
}

type service struct {
	logger  logger.CustomLogger
	readDB  *dao.Query
	writeDB *dao.Query
}

func New(l logger.CustomLogger, db mysql.Repo) Service {
	return &service{
		logger:  l,
		readDB:  dao.Use(db.GetDbR()),
		writeDB: dao.Use(db.GetDbW()),
	}
}

type CreateActivityInput struct {
	Name               string
	Banner             string
	ActivityCategoryID int64
	Status             int32
	PriceDraw          int64
	IsBoss             int32
	StartTime          *time.Time
	EndTime            *time.Time
}

type ModifyActivityInput struct {
	Name               string
	Banner             string
	ActivityCategoryID int64
	Status             int32
	PriceDraw          int64
	IsBoss             int32
	StartTime          *time.Time
	EndTime            *time.Time
}

type ListActivitiesInput struct {
	Name       string
	CategoryID int64
	IsBoss     *int32
	Status     *int32
	Page       int
	PageSize   int
}

type CreateIssueInput struct {
	IssueNumber string
	Status      int32
	Sort        int32
}

type ModifyIssueInput struct {
	IssueNumber string
	Status      int32
	Sort        int32
}

type CreateRewardInput struct {
	ProductID   int64
	Name        string
	Weight      int32
	Quantity    int64
	OriginalQty int64
	Level       int32
	Sort        int32
	IsBoss      int32
}

type ModifyRewardInput struct {
	ProductID   *int64
	Name        string
	Weight      *int32
	Quantity    *int64
	OriginalQty *int64
	Level       *int32
	Sort        *int32
	IsBoss      *int32
}
