//go:generate ${GOBIN}/dummygen -d=api_dummy.go -package=api ${GO_MODULE}/pkg/service/remediationticket/api RemediationTicketServiceAPI
package api

import (
	"context"

	"github.com/tidbcloud/devops/entity"
	tntent "github.com/tidbcloud/devops/entity/tenant"
	"github.com/tidbcloud/devops/pkg/service"
)

type RemediationTicketServiceAPI interface {
	ListTickets(ctx context.Context, param ListTicketParam) ([]*entity.RemediationTicket, int64, error)
	GetTicket(ctx context.Context, id uint64) (*entity.RemediationTicket, error)
	CreateTicket(ctx context.Context, param CreateTicketParam) (*uint64, error)
	CreateTicketAndTransferToRegionTSELeader(ctx context.Context, param CreateTicketParam) (*uint64, error)
	CancelTicket(ctx context.Context, id uint64, param CancelTicketParam) error
	TransferTicketPhase(ctx context.Context, id uint64, param TransferTicketParam) error
	SubmitPhaseTransitionApproval(ctx context.Context, id uint64, param TransferTicketParam) error
	ApproveTicketPhase(ctx context.Context, id uint64, param ApprovePhaseParam) error
	RejectTicketPhase(ctx context.Context, id uint64, param RejectPhaseParam) error
	GetTicketProgress(ctx context.Context, id uint64) ([]entity.RemediationTicketPhaseInfo, entity.RemediationTicketPhase, error)
	GetTicketApprovalByApprID(ctx context.Context, apprId uint64) (*entity.RemediationTicketPhaseApproval, error)
	GetTicketApprovals(ctx context.Context, ticketId uint64) ([]*entity.RemediationTicketPhaseApproval, error)
	GetApprovalFlow(ctx context.Context, ticketId uint64) (*entity.RemediationApprovalFlow, error)
	GenerateFinalDoc(ctx context.Context, ticketId uint64, forcedRegenerate bool) (string, error)
}

type RemediationTicketService interface {
	RemediationTicketServiceAPI

	service.RunnableService
}

type ListTicketParam struct {
	BizRegion *string
	Creator   *string
}

type CreateTicketParam struct {
	IncidentID uint64

	BizRegion       *tntent.TenantRegion
	Creator         *string
	Customer        string
	ClusterType     entity.RemediationTicketClusterType
	TenantID        *uint64
	ClusterID       *uint64
	Month           string
	InfoFromCreator string

	ApplicantEmail string
}

type TransferTicketParam struct {
	// Patch From Region TSE
	RootCauseFromGS string

	// Patch From RDG SLA Owner
	AccumulatedDownMinutes  *int
	MonthlyUptimePercentage string
	RootCauseFromRDG        string
	AccidentReportLink      string

	// Patch From Global Deal Desk
	ClusterBilling    string
	PredefinedPercent string
	ExtraPercent      string
	TotalCompensation string

	// General Info
	Version        int64 // need version number to avoid update on stale versions.
	SubmitterEmail string

	// Will be deprecated
	Reason     *entity.RemediationTicketReason
	ReportLink *string
}

type CancelTicketParam struct {
	CancellerEmail string
	Version        int64
}

type ApprovePhaseParam struct {
	ApproverEmail string
	ApprID        uint64
	Version       int64

	Input TransferTicketParam
}

type RejectPhaseParam struct {
	RejecterEmail string
	ApprID        uint64
	Message       string
	Version       int64
}
