package idlereminder

import (
	"context"
	"fmt"

	"github.com/andygrunwald/go-jira"
	"github.com/tidbcloud/devops/entity/message"
	"github.com/tidbcloud/devops/pkg/infra/clients/jiracli"
	"github.com/tidbcloud/devops/pkg/infra/config"
	"github.com/tidbcloud/devops/pkg/infra/consts"
	"github.com/tidbcloud/devops/pkg/infra/log"
	msgapi "github.com/tidbcloud/devops/pkg/service/message/api"
)

const QUERY_JIRA_WEEKLY_TICKETS = `project in (GTOC, TCOC) AND (("Severity (migrated)[Dropdown]" ="S1 - Service Unavailable" and (status = "UNDER INVESTIGATION" or status = "TODO") and created >= -14d and created <=-3d ) or  ("Severity (migrated)[Dropdown]" = "S2 - Significant Impact" and (status = "UNDER INVESTIGATION" or status = "TODO") and created >= -14d and created <= -7d) or ("Severity (migrated)[Dropdown]" in ("S3 - Non-critical issue", "S4 - Trivial issue or enhancement suggestion") and (status = "UNDER INVESTIGATION" or status = "TODO") and created <= -14d and created >= -28d)) and assignee is not empty ORDER BY project, cf[10158],cf[12379] ASC`
const JIRA_BROWSE_LINK = `https://tidb.atlassian.net/browse/`
const EG_LEADER_FIELD = `customfield_12379`

type WeeklyOncallChecker struct {
	jiraCli jiracli.JiraClient
	msgSvc  msgapi.MessageServiceAPI
	conf    config.WeeklyReportConfig
}

func NewWeeklyOncallChecker(
	jiraCli jiracli.JiraClient,
	msgSvc msgapi.MessageServiceAPI,
	conf config.WeeklyReportConfig,
) (*WeeklyOncallChecker, error) {

	return &WeeklyOncallChecker{
		jiraCli: jiraCli,
		msgSvc:  msgSvc,
		conf:    conf,
	}, nil
}

func (d *WeeklyOncallChecker) NotifyWeeklyOncallTickets(ctx context.Context) error {
	logger := log.FromContext(ctx)

	logger.Info("start get weekly oncall tickets and notify leaders")

	tickets, err := d.getWeeklyLongTailTickets()
	if err != nil {
		return fmt.Errorf("get weekly long tail tickets error: %w", err)
	}

	emailBodyVars, err := buildEmailBodyVars(tickets)
	if err != nil {
		return fmt.Errorf("build long tail tickets body error: %w", err)
	}

	fmt.Println(emailBodyVars["body"])

	err = d.msgSvc.SendEmail(ctx, msgapi.SendEmailParam{
		Name: "Notify Weekly Long Tail Issues By Email",
		Target: message.EmailTarget{
			Users: &message.EmailTargetUsers{
				Emails: d.conf.ReceiverEmails,
			},
		},
		Template: message.EmailTemplate{
			ID:        d.conf.TemplateID,
			Variables: emailBodyVars,
		},
		Reason:      "send long tail ticket email to leaders",
		Applicant:   consts.InternalVirtualEmail,
		FromAddress: d.conf.EmailFromAddress,
		CCAdresses:  d.conf.CC,
		BCCAdresses: d.conf.BCC,
	})
	if err != nil {
		return fmt.Errorf("send long tail tickets email error: %w", err)
	}

	logger.Info("get weekly oncall tickets and notify leaders done")

	return nil
}

func (c *WeeklyOncallChecker) getWeeklyLongTailTickets() ([]jira.Issue, error) {
	jql := QUERY_JIRA_WEEKLY_TICKETS
	options := &jira.SearchOptions{
		Expand:     "changelog",
		MaxResults: 100,
		Fields:     []string{"*all"},
	}
	tickets, err := c.jiraCli.SearchIssues(context.Background(), jql, &jiracli.SearchOptions{
		Expand:     options.Expand,
		MaxResults: options.MaxResults,
		Fields:     []string{"*all"},
	})
	if err != nil {
		return nil, err
	}
	return tickets.Issues, nil
}
