package remediationticket

import (
	"context"
	"fmt"
	"strconv"

	userv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/core-server/user/v1"
	"github.com/tidbcloud/devops/entity"
	apprent "github.com/tidbcloud/devops/entity/approval"
	"github.com/tidbcloud/devops/pkg/infra/clients/larkcli/document"
	apprsvcapi "github.com/tidbcloud/devops/pkg/service/approval/api"

	rmhelpers "github.com/tidbcloud/devops/pkg/service/remediationticket/helpers"
)

// DEPRECATED: use sendapproval() in actor instead
func (s *svc) SendApproval(ctx context.Context, ticket *entity.RemediationTicket) (*uint64, error) {
	applicantResp, err := s.userSvc.GetUser(ctx, &userv1.GetUserRequest{Email: ticket.ApplicantEmail})
	if err != nil {
		return nil, fmt.Errorf("get applicant %s info failed: %w", ticket.ApplicantEmail, err)
	}

	// create a param
	param := apprsvcapi.CreateApprovalParam{
		CreateApprovalParamBase: apprsvcapi.CreateApprovalParamBase{
			Name:       "Remediation Ticket",
			Applicant:  applicantResp.User.Email,
			DetailLink: rmhelpers.RemediationTicketDetailLink(ticket.ID),
			Parameters: map[string]string{
				"WARNING":         "Please go to the above link to approve the issue. Approve the ticket in lark/feishu is NOT recommended",
				"Incident ID":     strconv.FormatUint(ticket.AssociatedIncidentId, 10),
				"Applicant Email": ticket.ApplicantEmail,
			},
		},
		Nodes: nil,
	}

	if ticket.BizRegion != nil {
		param.Parameters["Biz Region"] = string(*ticket.BizRegion)
	}

	if ticket.Customer != nil {
		param.Parameters["Customer"] = *ticket.Customer
	}

	// create nodes

	// node0: Region TSE Leader
	regionTSELeaderNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	// node1: RDG SLA Owner
	rdgSLAOwnerNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	// node2: RDG Final Decision Maker
	rdgFinalDecisionMakerNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	// node3: Global Deal Desk
	globalDealDeskNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	// node4: Regional DM
	regionalDMNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	// node5: Commercial Operation
	commercialOperationNode := &apprent.ApproverNode{
		Method: apprent.ApproveMethodAny,
		Approver: &apprent.Approver{
			Emails: []string{"kaijie.chen@pingcap.com"},
		},
	}

	param.Nodes = []*apprent.ApproverNode{
		regionTSELeaderNode,
		rdgSLAOwnerNode,
		rdgFinalDecisionMakerNode,
		globalDealDeskNode,
		regionalDMNode,
		commercialOperationNode,
	}

	apprID, err := s.apprSvc.CreateApproval(ctx, param)
	if err != nil {
		return nil, fmt.Errorf("create approval failed: %s", err)
	}

	return apprID, nil
}

func generateDocContent(docBuilder document.DocumentBuilder, ticket *entity.RemediationTicket) {
	ctx := context.Background()

	// Section 1: Remediation Summary
	docBuilder.AppendTitleBlock(ctx, "Remediation Summary")
	if ticket.ClusterID != nil {
		docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Cluster ID: %d", ticket.ClusterID))
	}
	if ticket.TenantID != nil {
		docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Tenant ID: %d", *ticket.TenantID))
	}
	if ticket.Customer != nil {
		docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Customer Name: %s", *ticket.Customer))
	}
	if ticket.BizRegion != nil {
		docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Business Region: %s", *ticket.BizRegion))
	}
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Cluster Type: %s", ticket.ClusterType))
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Month: %s", ticket.Month))
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Monthly SLA: %s%%", ticket.MonthlyUptimePercentage))

	// Section 2: Incident Summary
	docBuilder.AppendTitleBlock(ctx, "Incident Summary")
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Incident ID: %d", ticket.AssociatedIncidentId))

	// Section 3: Root Cause from Global Support Perspective
	docBuilder.AppendTitleBlock(ctx, "Root Cause from Global Support Perspective")
	docBuilder.AppendPlainTextBlock(ctx, ticket.RootCauseFromGS)

	// Section 4: Root Cause from RDG Perspective
	docBuilder.AppendTitleBlock(ctx, "Root Cause from RDG Perspective")
	docBuilder.AppendPlainTextBlock(ctx, ticket.RootCauseFromRDG)

	// Section 5: Billing Info
	docBuilder.AppendTitleBlock(ctx, "Billing Info")
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Cluster Billing: %s", ticket.ClusterBilling))
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Predefined Compensation Percentage: %s%%", ticket.PredefinedPercent))
	docBuilder.AppendPlainTextBlock(ctx, fmt.Sprintf("Extra Compensation Percentage: %s%%", ticket.ExtraPercent))

}
