package ticket

import (
	"net/http"

	"github.com/gin-gonic/gin"

	tktapi "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/ticket-manager/ticket"
	apiutils "github.com/tidbcloud/aisupport/packages/sdk-go/infra/apiserver/utils"
	"github.com/tidbcloud/aisupport/packages/sdk-go/infra/errs"
	ticketsvcapi "github.com/tidbcloud/aisupport/services/ticket-manager/internal/services/ticket/api"
)

// CreateTicket creates a ticket snapshot from Jira.
//
//	@Summary	Create a ticket snapshot from Jira
//	@Id			TicketsHandlerCreateTicket
//	@Tags		TicketsHandler
//	@Accept		json
//	@Produce	json
//	@Param		jiraIssueKey	path		string						true	"Jira issue key"
//	@Param		request			body		tktapi.CreateTicketRequest	false	"Optional mock Jira issue payload"
//	@Success	200				{object}	tktapi.CreateTicketResponse
//	@Failure	default			{object}	base.BaseResponse
//	@Router		/api/v1/ticketmanager/tickets/{jiraIssueKey} [post]
func (h *TicketsHandler) CreateTicket(c *gin.Context) {
	issueKey := c.Param("jiraIssueKey")
	if issueKey == "" {
		apiutils.Fail(c, errs.APIErrorf(http.StatusBadRequest, "jiraIssueKey is required"))
		return
	}

	req := tktapi.CreateTicketRequest{}
	if err := c.ShouldBindJSON(&req); err != nil {
		apiutils.Fail(c, errs.APIErrorNew(http.StatusBadRequest, err))
		return
	}
	if req.JiraIssue != nil {
		if req.JiraIssue.Key == "" {
			req.JiraIssue.Key = issueKey
		}
		if req.JiraIssue.Key != issueKey {
			apiutils.Fail(c, errs.APIErrorf(http.StatusBadRequest, "jiraIssue.key must match jiraIssueKey"))
			return
		}
	}

	trigger, err := h.ingestService.CreateTicket(c, ticketsvcapi.CreateTicketParam{
		SyncFromIssue: issueKey,
		JiraIssue:     req.JiraIssue,
	})
	if err != nil {
		apiutils.Fail(c, err)
		return
	}

	apiutils.Success(c, &tktapi.CreateTicketResponse{DispatchTrigger: trigger})
}

// UpdateTicketJiraIssue refreshes a ticket snapshot from Jira.
//
//	@Summary	Refresh a ticket snapshot from Jira
//	@Id			TicketsHandlerUpdateTicketJiraIssue
//	@Tags		TicketsHandler
//	@Accept		json
//	@Produce	json
//	@Param		jiraIssueKey	path		string								true	"Jira issue key"
//	@Param		request			body		tktapi.UpdateTicketJiraIssueRequest	false	"Optional mock Jira issue payload"
//	@Success	200				{object}	base.BaseResponse
//	@Failure	default			{object}	base.BaseResponse
//	@Router		/api/v1/ticketmanager/tickets/{jiraIssueKey}/jira_issue [put]
func (h *TicketsHandler) UpdateTicketJiraIssue(c *gin.Context) {
	issueKey := c.Param("jiraIssueKey")
	if issueKey == "" {
		apiutils.Fail(c, errs.APIErrorf(http.StatusBadRequest, "jiraIssueKey is required"))
		return
	}

	req := tktapi.UpdateTicketJiraIssueRequest{}
	if err := c.ShouldBindJSON(&req); err != nil {
		apiutils.Fail(c, errs.APIErrorNew(http.StatusBadRequest, err))
		return
	}
	if req.JiraIssue != nil {
		if req.JiraIssue.Key == "" {
			req.JiraIssue.Key = issueKey
		}
		if req.JiraIssue.Key != issueKey {
			apiutils.Fail(c, errs.APIErrorf(http.StatusBadRequest, "jiraIssue.key must match jiraIssueKey"))
			return
		}
	}

	if err := h.ticketService.UpdateTicketJiraIssue(c.Request.Context(), ticketsvcapi.UpdateTicketJiraIssueParam{
		SyncFromIssue: issueKey,
		JiraIssue:     req.JiraIssue,
	}); err != nil {
		apiutils.Fail(c, err)
		return
	}

	apiutils.Success(c, nil)
}
