//go:generate ${GOBIN}/mockgen -destination repo_mock.go -package=repo ${GO_MODULE}/pkg/service/remediationticket/repo RemediationTicketRepo
package repo

import (
	"context"

	"github.com/tidbcloud/devops/entity"
	"github.com/tidbcloud/devops/pkg/infra/utils/repoopt"
	"github.com/tidbcloud/devops/pkg/service/remediationticket/repo/cvt"
	"github.com/tidbcloud/pkgv2/db"
)

type (
	PatchRemediationTicket         func(current *entity.RemediationTicket) error
	PatchRemediationTicketApproval func(current *entity.RemediationTicketPhaseApproval) error
)

type RemediationTicketRepo interface {
	QueryTicket(ctx context.Context, opts ...repoopt.Option) ([]*entity.RemediationTicket, error)
	LoadTicket(ctx context.Context, id uint64) (*entity.RemediationTicket, error)
	SaveTicket(ctx context.Context, ticket *entity.RemediationTicket) (uint64, error)
	PatchTicket(ctx context.Context, ticket *entity.RemediationTicket) error
	FunctionalPatchTicket(ctx context.Context, current *entity.RemediationTicket, patch ...PatchRemediationTicket) error

	QueryTicketLog(ctx context.Context, ticketId uint64) ([]*entity.RemediationTicketLog, error)
	CreateTicketLog(ctx context.Context, ticketLogItem *entity.RemediationTicketLog) error

	SaveTicketPhaseApproval(ctx context.Context, ticketPhaseApproval *entity.RemediationTicketPhaseApproval) (uint64, error)
	QueryTicketPhaseApproval(ctx context.Context, opts ...repoopt.Option) ([]*entity.RemediationTicketPhaseApproval, error)
	FunctionalPatchTicketPhaseApproval(ctx context.Context, current *entity.RemediationTicketPhaseApproval, patch ...PatchRemediationTicketApproval) error
}

func NewRemediationTicketRepo(dbp db.Provider) RemediationTicketRepo {
	//repo := &mockRepo{
	//	registry:         make([]entity.RemediationTicket, 0, 10),
	//	logRegistry:      make([]entity.RemediationTicketLog, 0, 10),
	//	autoIncrement:    0,
	//	logAutoIncrement: 0,
	//}

	driver := &driver{
		cvter:      cvt.NewConverter(),
		dbProvider: dbp,
	}

	tadriver := &tadriver{
		cvter:      cvt.NewConverter(),
		dbProvider: dbp,
	}

	return &repoImpl{
		driver:   driver,
		tadriver: tadriver,
	}

}
