package feishu

import (
	"context"

	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/config"
	log2 "github.com/pingcap-inc/clinic/clinic_data_service/pkg/log"

	lark "github.com/larksuite/oapi-sdk-go/v3"
	larkcore "github.com/larksuite/oapi-sdk-go/v3/core"
	larkdocx "github.com/larksuite/oapi-sdk-go/v3/service/docx/v1"
	"go.uber.org/zap"
)

func PushDefaultConfig(documentID string) {
	// Check environment variables, skip sending if in development environment
	if config.AppConfig.Env == "dev" {
		log2.PlainInfo("Development environment detected, skipping Feishu default config push")
		return
	}

	client := newLarkClient()
	// Create request object
	req := larkdocx.NewCreateDocumentBlockChildrenReqBuilder().
		DocumentId(documentID).
		BlockId(documentID).
		DocumentRevisionId(-1).
		Body(larkdocx.NewCreateDocumentBlockChildrenReqBodyBuilder().
			Children([]*larkdocx.Block{
				larkdocx.NewBlockBuilder().
					BlockType(2).
					Text(larkdocx.NewTextBuilder().
						Style(larkdocx.NewTextStyleBuilder().
							Build()).
						Elements([]*larkdocx.TextElement{
							larkdocx.NewTextElementBuilder().
								TextRun(larkdocx.NewTextRunBuilder().
									Content(`No Config Change`).
									Build()).
								Build(),
						}).
						Build()).
					Build(),
			}).
			Index(0).
			Build()).
		Build()

	// Send request
	resp, err := client.Docx.V1.DocumentBlockChildren.Create(context.Background(), req)

	// Handle errors
	if err != nil {
		log2.PlainError("push_cloud_document error", zap.Error(err))
		return
	}

	// Handle server errors
	if !resp.Success() {
		log2.PlainError("Feishu API error", zap.String("logId", resp.RequestId()), zap.String("error", larkcore.Prettify(resp.CodeError)))
		return
	}

	// Business logic processing
	log2.PlainInfo("Feishu document updated: " + larkcore.Prettify(resp))
}

/*
	// PushSummaryResult Push formatted summary results to Feishu document

// feishu api: https://open.feishu.cn/api-explorer/cli_a8c5690eb1b6500c?apiName=create&from=op_doc&project=docx&resource=document.block.children&version=v1
func PushSummaryResult(finalOutput map[string]interface{}, org dto.Org) {

		client := newLarkClient()

		// Build document content
		var blocks []*larkdocx.Block

		// Add main title
		// Use tableName from config file as title
		day := config.AppConfig.Day
		title := fmt.Sprintf("%s Slow Query Analysis Results", day)
		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(3). // Heading1 type
			Heading1(larkdocx.NewTextBuilder().
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(title).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		// Report generation time
		currentDate := time.Now().Format("2006-01-02 15:04:05") // Get current time (accurate to seconds)
		createTime := fmt.Sprintf("Report Generation Time: %s", currentDate)
		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(2). // Text block type
			Text(larkdocx.NewTextBuilder().
				Style(larkdocx.NewTextStyleBuilder().
					Build()).
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(createTime).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		// org id
		orgId := fmt.Sprintf("Tenant:  %s[%s]", org.OrgName, org.OrgID)
		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(2). // Text block type
			Text(larkdocx.NewTextBuilder().
				Style(larkdocx.NewTextStyleBuilder().
					Build()).
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(orgId).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		// Add Summary
		summaryText := "Summary"
		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(4). // Heading2 type
			Heading2(larkdocx.NewTextBuilder().
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(summaryText).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		// Get summary data
		summary := finalOutput["summary"].(map[string]interface{})

		// Add highlight box content
		totalQueries := int(summary["total_slow_queries"].(float64))
		uniqueDigests := int(summary["unique_digests"].(float64))
		criticalCount := int(summary["critical_count"].(float64))
		majorCount := int(summary["major_count"].(float64))

		highlightContent := fmt.Sprintf("⚡ %s (00:00 ~ 23:59 (UTC)), total %d slow query logs, %d unique records after Digest deduplication, data requiring attention:",
			day, totalQueries, uniqueDigests)

		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(2). // Text block type
			Text(larkdocx.NewTextBuilder().
				Style(larkdocx.NewTextStyleBuilder().
					Build()).
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(highlightContent).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		// Add Critical section
		//
		if criticalCount > 0 {
			criticalText := fmt.Sprintf("• Critical: %d", criticalCount)
			blocks = append(blocks, larkdocx.NewBlockBuilder().
				BlockType(2).
				Text(larkdocx.NewTextBuilder().
					Elements([]*larkdocx.TextElement{
						larkdocx.NewTextElementBuilder().
							TextRun(larkdocx.NewTextRunBuilder().
								Content(criticalText).
								Build()).
							Build(),
					}).
					Build()).
				Build())

			// Add Critical details
			if criticalDetails, ok := summary["critical_details"].(map[string]interface{}); ok {
				for key, value := range criticalDetails {
					detailText := fmt.Sprintf("    ◦ %s: %d", key, int(value.(float64)))
					blocks = append(blocks, larkdocx.NewBlockBuilder().
						BlockType(2).
						Text(larkdocx.NewTextBuilder().
							Elements([]*larkdocx.TextElement{
								larkdocx.NewTextElementBuilder().
									TextRun(larkdocx.NewTextRunBuilder().
										Content(detailText).
										Build()).
									Build(),
							}).
							Build()).
						Build())
				}
			}
		}

		// Add Major section
		if majorCount > 0 {
			majorText := fmt.Sprintf("• Major: %d", majorCount)
			blocks = append(blocks, larkdocx.NewBlockBuilder().
				BlockType(2).
				Text(larkdocx.NewTextBuilder().
					Elements([]*larkdocx.TextElement{
						larkdocx.NewTextElementBuilder().
							TextRun(larkdocx.NewTextRunBuilder().
								Content(majorText).
								Build()).
							Build(),
					}).
					Build()).
				Build())

			// Add Major details
			if majorDetails, ok := summary["major_details"].(map[string]interface{}); ok {
				for key, value := range majorDetails {
					detailText := fmt.Sprintf("    ◦ %s: %d", key, int(value.(float64)))
					blocks = append(blocks, larkdocx.NewBlockBuilder().
						BlockType(2).
						Text(larkdocx.NewTextBuilder().
							Elements([]*larkdocx.TextElement{
								larkdocx.NewTextElementBuilder().
									TextRun(larkdocx.NewTextRunBuilder().
										Content(detailText).
										Build()).
									Build(),
							}).
							Build()).
						Build())
				}
			}
		}

		// Add Detail
		Detail := "Detail"
		blocks = append(blocks, larkdocx.NewBlockBuilder().
			BlockType(4). // Heading2 type
			Heading2(larkdocx.NewTextBuilder().
				Elements([]*larkdocx.TextElement{
					larkdocx.NewTextElementBuilder().
						TextRun(larkdocx.NewTextRunBuilder().
							Content(Detail).
							Build()).
						Build(),
				}).
				Build()).
			Build())

		if criticalCount == 0 {
			text := "• None"
			blocks = append(blocks, larkdocx.NewBlockBuilder().
				BlockType(2).
				Text(larkdocx.NewTextBuilder().
					Elements([]*larkdocx.TextElement{
						larkdocx.NewTextElementBuilder().
							TextRun(larkdocx.NewTextRunBuilder().
								Content(text).
								Build()).
							Build(),
					}).
					Build()).
				Build())
		}

		// Create request, add below the specified afterBlockId
		afterBlock := org.DocumentId // Default to append content at document root node
		if org.AfterBlockId != "" {
			afterBlock = org.AfterBlockId
		} else if config.IsProd() {
			afterBlock = `EunEdvptfouzbvxaveLcqzP2nvb` // Maintain backward compatibility
		}
		req := larkdocx.NewCreateDocumentBlockChildrenReqBuilder().
			DocumentId(org.DocumentId).
			BlockId(afterBlock).
			DocumentRevisionId(-1).
			Body(larkdocx.NewCreateDocumentBlockChildrenReqBodyBuilder().
				Children(blocks).
				Index(0).
				Build()).
			Build()

		// Send request
		resp, err := client.Docx.V1.DocumentBlockChildren.Create(context.Background(), req)

		// Handle errors
		if err != nil {
			log2.PlainError("push JSON result to feishu error", zap.Error(err))
			return
		}

		// Handle server errors
		if !resp.Success() {
			log2.PlainError("Feishu API error", zap.String("logId", resp.RequestId()), zap.String("error", larkcore.Prettify(resp.CodeError)))
			return
		}

		// Business logic processing
		log2.PlainInfo("Successfully pushed summary to feishu document: " + org.DocumentId)

		if criticalCount > 0 {
			// Get the created Detail block ID as parent block ID
			var detailBlockID string
			if len(resp.Data.Children) > 0 {
				// Detail block is the last created block
				detailBlockID = *resp.Data.Children[len(resp.Data.Children)-1].BlockId
			} else {
				detailBlockID = org.DocumentId // If retrieval fails, use document ID as fallback
			}

			// Push QueryResults details below Detail block
			pushQueryResultsToFeishu(client, org.DocumentId, detailBlockID, finalOutput)
		}
	}
*/
type PushParams struct {
	ConfigChange string
	Clusters     string
	Reason       string
}

func newLarkClient() *lark.Client {
	return lark.NewClient(larkAppID, larkAppSecret)
}

// Inspection robot configuration
var larkAppID = "cli_a8c5690eb1b6500c"
var larkAppSecret = "w7Mx8u4jNHn07fDiTL0aRmBmN4LMH1jy"
