package main

import (
	"bytes"
	"context"
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
	"time"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
	"google.golang.org/api/option"

	log "github.com/sirupsen/logrus"
)

func GetGcpDevtierClusterNum(dateStart, dateEnd string) {
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, "gcp-digital-bi", option.WithCredentialsFile("/home/ssm-user/devtier_create_duration_warn/gcp_cred.json"))
	if err != nil {
		log.Fatalf("bigquery.NewClient: %v", err)
		return
	}
	content := query(ctx, client, dateStart, dateEnd)
	log.Infof("%s", content)
	client.Close()
	if !strings.Contains(content, "create_duration") {
		log.Infof("no warnning msg to be send")
		return
	}
	/*feishu api send*/
	feishuRobotNotify(content)
	return
}

func feishuRobotNotify(content string) {
	feiOpenApi := "https://open.feishu.cn/open-apis/bot/v2/hook/f3a838e2-1a9a-40cf-a3c6-a10c88e29a3f"
	//body := "{\"msg_type\":\"text\",\"content\":{\"text\":\"" + content + "\"}}"
	body := `{"msg_type":"text","content":{"text":"` + content + `"}}`
	log.Infof("%s,  %v", feiOpenApi, []byte(body))
	req, err := http.NewRequest("POST", feiOpenApi, bytes.NewBuffer([]byte(body)))
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		log.Errorf("%v", err)
		return
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Errorf("%v", err)
		return
	}
	log.Infof("%s", string(b))
}

func query(ctx context.Context, client *bigquery.Client, dateStart, dateEnd string) (content string) {
	content = ""
	query := client.Query(
		`
WITH
  tmp AS (
  SELECT
    TIMESTAMP_DIFF(creation_finished_time,created_at, SECOND) AS diff_second,
    TIMESTAMP_DIFF(deleted_time, creation_finished_time, MINUTE) AS alive_min,
    id,
    created_at,
    tenant_id
  FROM
    gcp-digital-bi.metadb.dbaas_clusters
  WHERE
    deploy_type = "shared"
    AND free = 1
    AND created_at >= "` + dateStart + ` 00:00:00"
    AND created_at <= "` + dateEnd + ` 23:59:59"),
  bug AS (
  SELECT
    COUNT(*) AS b
  FROM
    tmp
  WHERE
    diff_second > 300 ),
  total AS (
  SELECT
    COUNT(*) AS a
  FROM
    tmp ),
  detail AS (
  SELECT
    diff_second AS create_seconds,
    id AS cluster_id,
    tenant_id,
    created_at,
    alive_min,
  FROM
    tmp
  WHERE
    diff_second > 300 )
SELECT
  bug.b AS long_create_number,
  total.a AS total_create_number,
  detail.*
FROM
  bug,
  total,
  detail
ORDER by create_seconds desc
		`)
	rows, err := query.Read(ctx)
	if err != nil {
		log.Errorf("error iterating through results: %v", err)
		return
	}
	for {
		var values []bigquery.Value
		if err = rows.Next(&values); err == iterator.Done {
			break
		} else if err != nil {
			log.Errorf("error get rows: %v", err)
			return
		}
		if content == "" {
			content = fmt.Sprintf("集群创建时间预警：%v/%v[>=300s/total]\\n异常集群详情：\\ncreate_duration(s),cluster_id,tenant_id,created_at,cluster_live_min\\n", values[0], values[1])
		}
		content += fmt.Sprintf("%v,%v,%v,%v,%v\\n", values[2], values[3], values[4], values[5], values[6])
	}
	content += fmt.Sprintf("[time_range]:%s~%s\\n", dateStart, dateEnd)
	return
}

func main() {
	if len(os.Args) != 2 {
		log.Errorf("./main day|week")
		return
	}
	log.Infof("args[1]=[%v]", os.Args[1])
	yesterday := time.Now().AddDate(0, 0, -1).Format("2006-01-02")
	if os.Args[1] == "day" {
		GetGcpDevtierClusterNum(yesterday, yesterday)
		log.Infof("%s", yesterday)
	} else if os.Args[1] == "week" {
		aweekday := time.Now().AddDate(0, 0, -7).Format("2006-01-02")
		GetGcpDevtierClusterNum(aweekday, yesterday)
		log.Infof("%s ~ %s", yesterday, aweekday)
	} else {
		log.Infof("unknown args: %s", os.Args[1])
	}
}
