package route

import (
	"log"
	"net/http"
	"strconv"

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

	"github.com/gin-gonic/gin"
)

func redirectHandler(c *gin.Context) {
	log.Println("redirectHandler")
	redirectURL := c.Query("url")
	msgIdStr := c.Query("msgid")

	go func() {
		id, err := strconv.Atoi(msgIdStr)
		if err != nil {
			log.Println("redirectHandler msgid parse err: ", err, msgIdStr)
			return
		}

		message := model.Message{ID: int64(id)}
		if err := model.Find(model.GetApp().DB, &message); err != nil {
			log.Println("redirectHandler find messageId err: ", err, msgIdStr)
			return
		}
		message.NotifyTag = model.NotifyTag
		service.AddLog(&message, model.ClickEvent)
	}()

	c.Redirect(http.StatusFound, redirectURL)
}

func deleteIssueHandler(c *gin.Context) {
	issueId := c.Query("issue")
	resp := model.CommonResp[model.OK]
	if issueId == "" {
		resp = model.CommonResp[model.PARAMERROR]
		c.JSON(resp.StatusCode, resp)
		return
	}

	issue := model.Issue{ID: issueId}
	err := model.Find(model.GetApp().DB, &issue)
	if err != nil {
		resp = model.CommonResp[model.INNERERROR]
		c.JSON(resp.StatusCode, resp)
		return
	}

	issue.Status = "Deleted"
	_ = model.Save(model.GetApp().DB, issue)

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

func triggerNotifyHandler(c *gin.Context) {
	log.Println("triggerNotifyHandler")
	issueId := c.Query("issue")
	target := c.Query("target")
	resp := model.CommonResp[model.OK]
	if issueId == "" || target == "" {
		resp = model.CommonResp[model.PARAMERROR]
		c.JSON(resp.StatusCode, resp)
		return
	}

	issues, err := model.FindIssue(model.GetApp().DB, model.Issue{ID: issueId})
	if err != nil {
		resp = model.CommonResp[model.PARAMERROR]
		log.Println(err)
		c.JSON(resp.StatusCode, resp)
		return
	}

	// FIXME(cjl) maybe use gpool if needed
	go func() {
		for i := range issues {
			issue := issues[i]
			if issue.IsIssueDone() {
				continue
			}

			iJob := service.NewIssueJob(&issue, target)
			switch target {
			case model.NotificationTargetReporter:
				iJob.Receiver = issue.Reporter
			case model.NotificationTargetLeader, model.NotificationTargetAssignee:
				iJob.Receiver = issue.Assignee
			default:
				log.Println("[error] triggerNotifyHandler not support such target recently ", target)
				continue
			}

			log.Println("triggerNotifyHandler ", issue, target)
			iJob.Run()
		}
	}()

	c.JSON(resp.StatusCode, resp)
}
