package model

import (
	"time"

	"gorm.io/gorm"

	"github.com/pingcap-inc/clinic/pkg/jiradb"
)

func ListIssueByIds(ids []uint) ([]jiradb.JiraIssue, error) {
	issues := []jiradb.JiraIssue{}
	if len(ids) == 0 {
		return issues, nil
	}
	err := jiradb.Transaction(func(txn *gorm.DB) error {
		err := txn.Table("jiraissue").Find(&issues, ids).Error
		if err != nil && err != gorm.ErrRecordNotFound {
			return err
		}
		return nil
	})
	if err != nil {
		return nil, err
	}
	return issues, nil
}

func GetIssueById(id uint) (*jiradb.JiraIssue, error) {
	issue := jiradb.JiraIssue{}
	err := jiradb.Transaction(func(txn *gorm.DB) error {
		return txn.Table("jiraissue").First(&issue, id).Error
	})
	if err != nil {
		return nil, err
	}
	return &issue, nil
}

func GetIssueByKey(project, num uint) (*jiradb.JiraIssue, error) {
	issue := jiradb.JiraIssue{}
	err := jiradb.Transaction(func(txn *gorm.DB) error {
		return txn.Table("jiraissue").Where(&jiradb.JiraIssue{
			Project:  project,
			IssueNum: num,
		}).First(&issue).Error
	})
	return &issue, err
}

func ListIssueByComments(comments []jiradb.JiraAction) (map[uint]jiradb.JiraIssue, error) {
	issueIds := []uint{}
	for _, comment := range comments {
		issueIds = append(issueIds, comment.IssueId)
	}

	issues, err := ListIssueByIds(issueIds)
	if err != nil {
		return nil, err
	}
	issueM := map[uint]jiradb.JiraIssue{} // issue id -> jira issue
	for _, issue := range issues {
		issueM[issue.ID] = issue
	}

	commentIssueM := map[uint]jiradb.JiraIssue{} // comment id -> jira issue
	for _, comment := range comments {
		if _, ok := issueM[comment.IssueId]; ok {
			commentIssueM[comment.ID] = issueM[comment.IssueId]
		}
	}
	return commentIssueM, nil
}

func ListRecentIssueWithClinicLink(recent time.Duration) ([]jiradb.JiraIssue, error) {
	issues := []jiradb.JiraIssue{}
	err := jiradb.Transaction(func(txn *gorm.DB) error {
		err := txn.Table("jiraissue").Where(
			"UPDATED > ? AND (DESCRIPTION LIKE '%clinic.pingcap.com%' OR DESCRIPTION LIKE '%clinic-ingress-679409387.cn-north-1.elb.amazonaws.com.cn%')",
			time.Now().Add(-recent),
		).Find(&issues).Error
		if err != nil && err != gorm.ErrRecordNotFound {
			return err
		}
		return nil
	})
	if err != nil {
		return nil, err
	}
	return issues, nil
}
