package main

// import (
// 	"bytes"
// 	"encoding/json"
// 	"fmt"
// 	"net/http"
// 	"regexp"
// 	"time"

// 	"github.com/pingcap/log"
// 	"go.uber.org/zap"

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

// func SyncJira(ch <-chan time.Time) error {
// 	re := regexp.MustCompile(`uuid=([\-\w+]+)`)
// 	for range ch {
// 		log.Info("start sync jira...")
// 		fileIssueM, err := ListRecentIssueWithClinicLink(re)
// 		if err != nil {
// 			log.Error("fetch issue list with clinic link failed", zap.Error(err))
// 			return err
// 		}
// 		log.Info("list rencent issues with clinic link", zap.Int("issue count", len(fileIssueM)))
// 		for file, issues := range fileIssueM {
// 			for _, issue := range issues {
// 				if issue.Project != oncallProjectKey {
// 					log.Info("not oncall, ignore", zap.Int("project", int(issue.Project)), zap.Uint("number", issue.IssueNum))
// 					continue
// 				}
// 				if err := PutAssociateJiraIssue(file, issue); err != nil {
// 					log.Error("put associate failed", zap.String("file", file), zap.Uint("issue-number", issue.IssueNum), zap.Error(err))
// 					fmt.Printf("put associate for file %s, issue ONCALL-%d failed: %s\n", file, issue.IssueNum, err)
// 				}
// 				log.Info("put issue success", zap.Uint("number", issue.IssueNum))
// 			}
// 		}
// 		log.Info("end sync jira.")
// 	}
// 	return nil
// }

// func PutAssociateJiraIssue(fileUUID string, issue jiradb.JiraIssue) error {
// 	serverIssue := db.JiraIssue{
// 		ID:          issue.ID,
// 		IssueNumber: issue.IssueNum,
// 		Project:     "ONCALL",
// 		Summary:     issue.Summary,
// 	}
// 	buf := bytes.NewBuffer(nil)
// 	if err := json.NewEncoder(buf).Encode(serverIssue); err != nil {
// 		return err
// 	}
// 	req, err := http.NewRequest(http.MethodPut, fmt.Sprintf("%s/api/system/associations/files/%s/jira-issues/%d", endpoint, fileUUID, issue.ID), buf)
// 	if err != nil {
// 		return err
// 	}
// 	resp, err := request(req)
// 	if err != nil {
// 		return err
// 	}
// 	defer resp.Body.Close()

// 	return nil
// }

// func ListRecentIssueWithClinicLink(re *regexp.Regexp) (map[string][]jiradb.JiraIssue, error) {
// 	m := map[string][]jiradb.JiraIssue{} // fileUUID -> issues
// 	issueM, err := ListRecentIssueWithClinicLinkFromDescription(re)
// 	if err != nil {
// 		return nil, err
// 	}
// 	for file, issues := range issueM {
// 		m[file] = append(m[file], issues...)
// 	}

// 	issueM, err = ListRecentIssueWithClinicLinkFromComment(re)
// 	if err != nil {
// 		return nil, err
// 	}
// 	for file, issues := range issueM {
// 		m[file] = append(m[file], issues...)
// 	}
// 	return m, nil
// }

// func ListRecentIssueWithClinicLinkFromDescription(re *regexp.Regexp) (map[string][]jiradb.JiraIssue, error) {
// 	fileIssueM := map[string][]jiradb.JiraIssue{} // fileUUID -> issues
// 	issues, err := model.ListRecentIssueWithClinicLink(time.Hour * 168)
// 	if err != nil {
// 		return nil, err
// 	}

// 	for _, issue := range issues {
// 		xxs := re.FindAllStringSubmatch(issue.Description, -1)
// 		for _, xs := range xxs {
// 			if len(xs) == 0 {
// 				continue
// 			}
// 			fileUUID := xs[1]
// 			fileIssueM[fileUUID] = append(fileIssueM[fileUUID], issue)
// 		}
// 	}

// 	return fileIssueM, nil
// }

// func ListRecentIssueWithClinicLinkFromComment(re *regexp.Regexp) (map[string][]jiradb.JiraIssue, error) {
// 	fileCommentM := map[string][]jiradb.JiraAction{} // fileUUID -> comments
// 	comments, err := model.ListRecentCommentWithClinicLink(time.Hour * 168)
// 	if err != nil {
// 		return nil, err
// 	}
// 	for _, comment := range comments {
// 		xxs := re.FindAllStringSubmatch(comment.ActionBody, -1)
// 		for _, xs := range xxs {
// 			if len(xs) == 0 {
// 				continue
// 			}
// 			fileUUID := xs[1]
// 			fileCommentM[fileUUID] = append(fileCommentM[fileUUID], comment)
// 		}
// 	}

// 	commentIssueM, err := model.ListIssueByComments(comments)
// 	if err != nil {
// 		return nil, err
// 	}

// 	fileIssueM := map[string][]jiradb.JiraIssue{} // fileUUID -> issues
// 	for file, comments := range fileCommentM {
// 		for _, comment := range comments {
// 			if issue, ok := commentIssueM[comment.ID]; ok {
// 				fileIssueM[file] = append(fileIssueM[file], issue)
// 			}
// 		}
// 	}

// 	return fileIssueM, nil
// }
