package route

import (
	"log"
	"strings"

	"github.com/pingcap/jira-bot/pkg/util"
	"github.com/pingcap/jira-bot/service"

	larkcardhttp "github.com/larksuite/oapi-sdk-go/card/http"
	larkeventhttp "github.com/larksuite/oapi-sdk-go/event/http"

	"github.com/gin-gonic/gin"

	"github.com/pingcap/jira-bot/model"
)

func eventCallback(c *gin.Context) {
	log.Println("eventCallback")
	larkeventhttp.Handle(model.GetApp().LarkConf, c.Request, c.Writer)
}

func cardCallback(c *gin.Context) {
	log.Println("cardCallback")
	larkcardhttp.Handle(model.GetApp().LarkConf, c.Request, c.Writer)
}

func reverseProxyHandler(c *gin.Context) {
	// todo cjl
	log.Println("githubCallback")
	proxy := util.ReversProxy("http://localhost:9081")
	proxy.ServeHTTP(c.Writer, c.Request)
}

func jiraCallback(c *gin.Context) {
	var info model.JiraIssueInfo
	resp := model.CommonResp[model.OK]
	//body, err := ioutil.ReadAll(c.Request.Body)
	//if err != nil {
	//	c.JSON(resp.StatusCode, resp)
	//	return
	//}
	//log.Println("jira callback: ", string(body))
	//c.Request.Body = ioutil.NopCloser(bytes.NewReader(body))
	err := c.ShouldBindJSON(&info)
	if err != nil {
		resp = model.CommonResp[model.PARAMERROR]
		log.Println("jiraCallback ShouldBindJSON error: ", err)
		c.JSON(resp.StatusCode, resp)
		return
	}

	issue, err := info.ToIssue()
	if err != nil {
		log.Println("Failed to generate issue record: ", err)
		resp = model.CommonResp[model.NOTVALID]
		c.JSON(resp.StatusCode, resp)
		return
	}

	if info.WebhookEvent == "jira:issue_deleted" {
		issue.Status = "Deleted"
		log.Println("Delete issue", issue.ID, issue.Status)
	}

	err = model.Save(model.GetApp().DB, issue)
	if err != nil {
		log.Println("Failed to save record to database: ", err)
	}

	assignee := model.User{Email: issue.AssigneeEmail, JiraUserDisplayName: issue.Assignee}
	findedAssigneeUser, _ := model.FindUser(model.GetApp().DB, assignee)
	if findedAssigneeUser == nil {
		err = model.Save(model.GetApp().DB, &assignee)
		if err != nil {
			log.Println("Failed to save assignee to database err: ", err, assignee)
		}
	}
	reporter := model.User{Email: issue.ReporterEmail, JiraUserDisplayName: issue.Reporter}
	findedReporterUser, _ := model.FindUser(model.GetApp().DB, reporter)
	if findedReporterUser == nil {
		err = model.Save(model.GetApp().DB, &reporter)
		if err != nil {
			log.Println("Failed to save reporter to database err: ", err, reporter)
		}
	}

	watchers := strings.Split(issue.Watchers, ",")
	log.Println("len(watchers) = ", len(watchers), " len(issue.WatcherEmails) = ",
		len(issue.WatcherEmails), issue.WatcherEmails, watchers, info.Issue.Fields.Watches)
	for i := 0; i < len(watchers) && i < len(issue.WatcherEmails); i++ {
		watcher := model.User{Email: issue.WatcherEmails[i], JiraUserDisplayName: watchers[i]}
		findedWatcherUser, _ := model.FindUser(model.GetApp().DB, watcher)
		if findedWatcherUser == nil {
			err = model.Save(model.GetApp().DB, &watcher)
			if err != nil {
				log.Println("Failed to save watcher to database err: ", err, watcher)
			}
		}
	}

	service.UpdateIssue(issue)
	c.JSON(resp.StatusCode, resp)
}
