package db

import (
	"database/sql"
	"log"
	"strings"
	"time"

	"github.com/go-sql-driver/mysql"
	"github.com/spf13/viper"
)

var db *sql.DB

const maxConnectionTime = time.Minute * 3
const maxOpenConns = 1000
const maxIdleConns = 1000

type ClusterTenant struct {
	Cluster string
	Tenant  string
}

func getDB() *sql.DB {
	if db != nil {
		return db
	}
	cfg := mysql.Config{
		User:                 viper.GetString("db.user"),
		Passwd:               viper.GetString("db.password"),
		Net:                  "tcp",
		Addr:                 viper.GetString("db.address"),
		DBName:               viper.GetString("db.database"),
		AllowNativePasswords: true,
	}
	db1, err := sql.Open("mysql", cfg.FormatDSN())
	db = db1
	if err != nil {
		panic(err)
	}
	// See "Important settings" section.
	db.SetConnMaxLifetime(time.Minute * 3)
	db.SetMaxOpenConns(10)
	db.SetMaxIdleConns(10)
	db.Exec("set time_zone = '+8:00'")
	return db
}

// func GetClusterWithTenant() []ClusterTenant {
// 	rows, err := getDB().Query("select distinct c.id,c.tenant_id from tmp_curr_clusters c left join tmp_curr_tenants t on c.tenant_id = t.id where t.status = 'active' and c.status = 'normal' and c.free != 1")
// 	if err != nil {
// 		panic(err)
// 	}
// 	result := make([]ClusterTenant, 0)

// 	for rows.Next() {
// 		var cluster string
// 		var tenant string
// 		err2 := rows.Scan(&cluster, &tenant)
// 		if err != nil {
// 			log.Fatal(err2)
// 		}
// 		result = append(result, ClusterTenant{Cluster: cluster, Tenant: tenant})
// 	}

// 	// append OSSInsight.
// 	result = append(result, ClusterTenant{Cluster: "1379661944632784068", Tenant: "1372813089187041280"})
// 	// Wetech
// 	result = append(result, ClusterTenant{Cluster: "1379661944646409222", Tenant: "1372813089209061633"})
// 	result = append(result, ClusterTenant{Cluster: "1379661944646409234", Tenant: "1372813089209061633"})
// 	result = append(result, ClusterTenant{Cluster: "1379661944646412573", Tenant: "1372813089209061633"})
// 	result = append(result, ClusterTenant{Cluster: "1379661944646412567", Tenant: "1372813089209061633"})

// 	return result
// }

type ThanosTenantCluster struct {
	ClusterId string
	TenantId  string
	Created   string
	End       string
}

func toPromTIme(origin string) string {
	split_slice := strings.Split(origin, " ")
	return split_slice[0] + "T" + split_slice[1] + ".000Z"
}

func GetThanosTenantAndCluster() []ThanosTenantCluster {
	rows, err := getDB().Query(`select  c.id,c.tenant_id,c.created_at,ifnull(c.deleted_time,
		'2022-11-02 06:00:00') as deleted_time from tmp_dw.tmp_curr_clusters c left join tmp_dw.tmp_curr_tenants t on c.tenant_id = t.id`)
	if err != nil {
		panic(err)
	}

	result := make([]ThanosTenantCluster, 0)
	for rows.Next() {
		var cluster_id string
		var tenant_id string
		var created string
		var end string

		err2 := rows.Scan(&cluster_id, &tenant_id, &created, &end)
		if err2 != nil {
			log.Fatal(err2)
		}

		result = append(result, ThanosTenantCluster{cluster_id, tenant_id, (created), (end)})
	}
	return result
}

type S3Cluster struct {
	ClusterId string
	TenantId  string
	ProjectId string
}

// func GetS3Clusters() []S3Cluster {
// 	rows, err := getDB().Query(`select  c.id,c.tenant_id,c.project_id from tmp_dw.tmp_curr_clusters c left join tmp_dw.tmp_curr_tenants t on c.tenant_id = t.id where c.free = 0 and c.created_at > "2022-09-27 00:00:00"`)
// 	if err != nil {
// 		panic(err)
// 	}

// 	result := make([]S3Cluster, 0)
// 	for rows.Next() {
// 		var cluster_id string
// 		var tenant_id string
// 		var project_id string

// 		err2 := rows.Scan(&cluster_id, &tenant_id, &project_id)
// 		if err2 != nil {
// 			log.Fatal(err2)
// 		}

// 		result = append(result, S3Cluster{ClusterId: cluster_id, TenantId: tenant_id, ProjectId: project_id})
// 	}
// 	return result
// }
