package main

import (
	"encoding/json"
	"fmt"
	"log"
	"testing"
	"time"

	"github.com/stretchr/testify/assert"

	"github.com/pingcap-inc/lark-bots/v2/pkg/config"
	"github.com/pingcap-inc/lark-bots/v2/pkg/job"
	"github.com/pingcap-inc/lark-bots/v2/pkg/util"
)

func TestCardTemplate(t *testing.T) {
	cardContent := `
{
    "config": {
        "wide_screen_mode": true
    },
    "header": {
        "template": "blue",
        "title": {
            "content": "时间都去哪了？给自己做个 profiling",
            "tag": "plain_text"
        }
    },
    "elements": [
        {
            "tag": "div",
            "text": {
                "tag": "lark_md",
                "content": "你昨天写代码用了多少时间?"
            },
            "extra": {
                "tag": "select_static",
                "placeholder": {
                    "tag": "plain_text",
                    "content": "请选择"
                },
                "value": {
                    "work-category": "coding"
                },
                "options": [
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "少于 20%"
                        },
                        "value": "0"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "20%"
                        },
                        "value": "20"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "40%"
                        },
                        "value": "40"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "60%"
                        },
                        "value": "60"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "80%"
                        },
                        "value": "80"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "多于 80%"
                        },
                        "value": "100"
                    }
                ]
            }
        },
        {
            "tag": "div",
            "text": {
                "tag": "lark_md",
                "content": "你昨天开会用了多少时间?"
            },
            "extra": {
                "tag": "select_static",
                "placeholder": {
                    "tag": "plain_text",
                    "content": "请选择"
                },
                "value": {
                    "work-category": "meeting"
                },
                "options": [
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "少于 20%"
                        },
                        "value": "0"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "20%"
                        },
                        "value": "20"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "40%"
                        },
                        "value": "40"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "60%"
                        },
                        "value": "60"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "80%"
                        },
                        "value": "80"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "多于 80%"
                        },
                        "value": "100"
                    }
                ]
            }
        },
        {
            "tag": "div",
            "text": {
                "tag": "lark_md",
                "content": "你昨天支持客户用了多少时间?"
            },
            "extra": {
                "tag": "select_static",
                "placeholder": {
                    "tag": "plain_text",
                    "content": "请选择"
                },
                "value": {
                    "work-category": "support"
                },
                "options": [
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "少于 20%"
                        },
                        "value": "0"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "20%"
                        },
                        "value": "20"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "40%"
                        },
                        "value": "40"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "60%"
                        },
                        "value": "60"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "80%"
                        },
                        "value": "80"
                    },
                    {
                        "text": {
                            "tag": "plain_text",
                            "content": "多于 80%"
                        },
                        "value": "100"
                    }
                ]
            }
        },
        {
            "tag": "hr"
        },
        {
            "tag": "note",
            "elements": [
                {
                    "tag": "lark_md",
                    "content": "🔍 [查看报告](https://open.feishu.cn/document/ukTMukTMukTM/uYjNwUjL2YDM14iN2ATN/)"
                }
            ]
        }
    ]
}
	`
	card := CardTemplate{}
	json.Unmarshal([]byte(cardContent), &card)
	assert.Equal(t, 5, len(card.Elements))

	beReplaceElement := card.Elements[0]
	replaceElement := CardElement{}
	replaceElement.Tag = beReplaceElement.Tag
	replaceElementTitle := CardElementField{}
	replaceElementTitle.IsShort = true
	replaceElementTitle.Text.Tag = "plain_text"
	replaceElementTitle.Text.Content = beReplaceElement.Text.Content
	replaceElementValue := CardElementField{}
	replaceElementValue.IsShort = true
	replaceElementValue.Text.Tag = "plain_text"
	replaceElementValue.Text.Content = "\t\t\t\t3小时"
	replaceElement.Fields = append(replaceElement.Fields, replaceElementTitle, replaceElementValue)

	card.Elements[0] = replaceElement
	b, _ := json.Marshal(card)
	log.Println(string(b))
	assert.Equal(t, string(b), `{"config":{"wide_screen_mode":true},"header":{"template":"blue","title":{"content":"时间都去哪了？给自己做个 profiling","tag":"plain_text"}},"elements":[{"tag":"div","fields":[{"is_short":true,"text":{"tag":"plain_text","content":"你昨天写代码用了多少时间?"}},{"is_short":true,"text":{"tag":"plain_text","content":"\t\t\t\t3小时"}}]},{"tag":"div","text":{"tag":"lark_md","content":"你昨天开会用了多少时间?"},"extra":{"tag":"select_static","placeholder":{"tag":"plain_text","content":"请选择"},"value":{"work-category":"meeting"},"options":[{"text":{"tag":"plain_text","content":"少于 20%"},"value":"0"},{"text":{"tag":"plain_text","content":"20%"},"value":"20"},{"text":{"tag":"plain_text","content":"40%"},"value":"40"},{"text":{"tag":"plain_text","content":"60%"},"value":"60"},{"text":{"tag":"plain_text","content":"80%"},"value":"80"},{"text":{"tag":"plain_text","content":"多于 80%"},"value":"100"}]}},{"tag":"div","text":{"tag":"lark_md","content":"你昨天支持客户用了多少时间?"},"extra":{"tag":"select_static","placeholder":{"tag":"plain_text","content":"请选择"},"value":{"work-category":"support"},"options":[{"text":{"tag":"plain_text","content":"少于 20%"},"value":"0"},{"text":{"tag":"plain_text","content":"20%"},"value":"20"},{"text":{"tag":"plain_text","content":"40%"},"value":"40"},{"text":{"tag":"plain_text","content":"60%"},"value":"60"},{"text":{"tag":"plain_text","content":"80%"},"value":"80"},{"text":{"tag":"plain_text","content":"多于 80%"},"value":"100"}]}},{"tag":"hr"},{"tag":"note","elements":[{"tag":"lark_md","content":"🔍 [查看报告](https://open.feishu.cn/document/ukTMukTMukTM/uYjNwUjL2YDM14iN2ATN/)"}]}]}`)
}

func TestReplaceCardTemplate(t *testing.T) {
	config.InitConfig("config", "yml", "./etc")
	app := NewApp()
	job.Start()
	app.OnStarUp()

	openMessageId := "1"
	answers := app.Answers[openMessageId]
	qMessage := QuestionnaireMessage{}
	err := app.DB.Find(&qMessage, QuestionnaireMessage{OpenMessageID: openMessageId}).Error
	if err != nil {
		t.Fatal(err)
	}

	q := app.Questionnaires[qMessage.QuestionnaireId]
	if len(answers) == len(q.Card.Elements) {
		cardTemplate := q.Card.Copy()
		replaceData := struct {
			Yesterday string `key:"yesterday"`
		}{fmt.Sprintf("%d月%d日", time.Now().Month(), time.Now().Day())}
		cardTemplate.Replace(replaceData)
		// replace card elements
		for key, answer := range answers {
			var preElement *CardElement
			var idx int
			for idx = range q.Card.Elements {
				if q.Card.Elements[idx].Extra.Value.WorkCategory == key {
					preElement = &q.Card.Elements[idx]
					break
				}
			}
			replaceElement := CardElement{}
			replaceElementTitle := CardElementField{}
			replaceElementTitle.IsShort = true
			replaceElementTitle.Text.Tag = "plain_text"
			replaceElementTitle.Text.Content = preElement.Text.Content
			replaceElementValue := CardElementField{}
			replaceElementValue.IsShort = true
			replaceElementValue.Text.Tag = "plain_text"
			replaceElementValue.Text.Content = fmt.Sprintf("\t\t\t\t%s小时", answer)
			replaceElement.Fields = append(replaceElement.Fields, replaceElementTitle, replaceElementValue)
			replaceElement.Tag = preElement.Tag
			cardTemplate.Elements[idx] = replaceElement
		}

		cardTemplate.Elements = append(cardTemplate.Elements, AddHr(), AddThanks("感谢反馈"))
		cardTemplateBytes, _ := json.Marshal(cardTemplate)
		t.Log(util.ByteSliceToString(cardTemplateBytes))
	}
}

func TestAppRun(t *testing.T) {
	config.InitConfig("config", "yml", "./etc")
	app := NewApp()
	q := Questionnaire{TargetList: "yumin.li@pingcap.com,R&D Group|Engineering Productivity|Digital Platform|PM"}
	q.AppInst = app
	q.Run()
	app.Run()
}

func TestGeneratePNG(t *testing.T) {
	config.InitConfig("config", "yml", "./etc")
	app := NewApp()
	app.OnStarUp()
	app.GeneratePNG("产研时间占比调查", "ou_74b5760fcec44d92e7ef1b7e6211a8ad", "chenjianlin@pingcap.com", 1)
}

func TestReplace(t *testing.T) {
	s := replace("hello ${name}", struct {
		Cjl string `key:"name"`
	}{"chenjianlin"})

	t.Log(s)
}
