package datainit

import (
	"github.com/pingcap/dbaas/billing2/db"
	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/utils/panicIf"
)

// ShowKindName{ShowCategoryName { ShowService|| Labels-value}}
func GetCategoryLabel() map[string]entity.CategoryItemShow {

	res := map[string]entity.CategoryItemShow{}
	//1
	res["Node Compute Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Node Compute Cost",
		Labels: map[string]string{
			"COMPONENT_TYPE_TIDB":    "TiDB",
			"COMPONENT_TYPE_TIKV":    "TiKV",
			"COMPONENT_TYPE_TIFLASH": "TiFlash",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Node Compute":   1,
			"TiDB":           1,
			"TiKV":           2,
			"TiFlash":        3,
		},
		LabelKey:          "component",
		ShowServicePrefix: "Node Compute - ",
		ShowCategoryName:  "Node Compute",
		UseCateGory:       false,
	}
	//2
	res["Node Storage Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Node Storage Cost",
		Labels: map[string]string{
			"COMPONENT_TYPE_TIKV":    "TiKV",
			"COMPONENT_TYPE_TIFLASH": "TiFlash",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Node Storage":   2,
			"TiKV":           1,
			"TiFlash":        2,
		},
		LabelKey:          "component",
		ShowCategoryName:  "Node Storage",
		ShowServicePrefix: "Node Storage - ",
		UseCateGory:       false,
	}
	//3
	res["Backup Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Backup Cost",
		Labels: map[string]string{
			"Storage Cost":     "Single Region Storage",
			"default":          "Single Region Storage",
			"Replication Cost": "Replication",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated":        2,
			"Backup":                3,
			"Single Region Storage": 1,
			"Replication":           4,
		},
		LabelKey:          "component",
		ShowCategoryName:  "Backup",
		ShowServicePrefix: "Backup - ",
		UseCateGory:       false,
	}
	//3 -backup -dual
	res["Dual Region Storage"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Dual Region Storage",
		Labels: map[string]string{
			"Dual Region Storage": "Dual Region Storage",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated":      2,
			"Backup":              3,
			"Dual Region Storage": 2,
		},
		LabelKey:          "Dual Region Storage",
		ShowCategoryName:  "Backup",
		ShowServicePrefix: "Backup - ",
		UseCateGory:       true,
	}
	//4
	res["Data Transfer Cost - Load Balancing"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - Load Balancing",
		Labels: map[string]string{
			"Data Transfer Cost": "Load Balancing",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Load Balancing": 4,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//5
	res["Data Transfer Cost - AWS Load Balancing"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - AWS Load Balancing",
		Labels: map[string]string{
			"Data Transfer Cost": "Load Balancing",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Load Balancing": 4,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//6
	res["Data Transfer Cost - AWS Same Region"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - AWS Same Region",
		Labels: map[string]string{
			"Data Transfer Cost": "Same Region",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Same Region":    3,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//7
	res["Data Transfer Cost - AWS Cross Region"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - AWS Cross Region",
		Labels: map[string]string{
			"Data Transfer Cost": "Cross Region",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Cross Region":   2,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//8
	res["Data Transfer Cost - AWS Internet"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - AWS Internet",
		Labels: map[string]string{
			"Data Transfer Cost": "Internet",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Internet":       1,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//9
	res["Data Transfer Cost - AWS DM NAT Gateway Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - AWS DM NAT Gateway Cost",
		Labels: map[string]string{
			"Data Transfer Cost": "DM NAT Gateway",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"DM NAT Gateway": 5,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//10
	res["Data Transfer Cost - GCP Load Balancing"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - GCP Load Balancing",
		Labels: map[string]string{
			"Data Transfer Cost": "Load Balancing",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Load Balancing": 4,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//11
	res["Data Transfer Cost - GCP Same Region"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - GCP Same Region",
		Labels: map[string]string{
			"Data Transfer Cost": "Same Region",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Same Region":    3,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//12
	res["Data Transfer Cost - GCP Cross Region"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - GCP Cross Region",
		Labels: map[string]string{
			"Data Transfer Cost": "Cross Region",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Cross Region":   2,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//13
	res["Data Transfer Cost - GCP Internet"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - GCP Internet",
		Labels: map[string]string{
			"Data Transfer Cost": "Internet",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"Internet":       1,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//14
	res["Data Transfer Cost - GCP DM NAT Gateway Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "Data Transfer Cost - GCP DM NAT Gateway Cost",
		Labels: map[string]string{
			"Data Transfer Cost": "DM NAT Gateway",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated": 2,
			"Data Transfer":  6,
			"DM NAT Gateway": 5,
		},
		LabelKey:         "Data Transfer Cost",
		ShowCategoryName: "Data Transfer",
		UseCateGory:      true,
	}
	//15
	res["DM RCU Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "DM RCU Cost",
		Labels: map[string]string{
			"DM RCU Cost": "Replication Capacity Units",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated":             2,
			"Data Migration":             4,
			"Replication Capacity Units": 1,
		},
		LabelKey:         "DM RCU Cost",
		ShowCategoryName: "Data Migration",
		UseCateGory:      true,
		MeasureUnit:      "RCU",
	}
	//16 Serverless-1
	res["Serverless Row Storage Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Serverless",
		Category:     "Serverless Row Storage Cost",
		OrderMap: map[string]int32{
			"TiDB Serverless":   1,
			"Row-based Storage": 1,
		},
		ShowCategoryName: "Row-based Storage",
		UseCateGory:      true,
	}
	//17 Serverless-2
	res["Serverless Column Storage Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Serverless",
		Category:     "Serverless Column Storage Cost",
		OrderMap: map[string]int32{
			"TiDB Serverless":  1,
			"Columnar Storage": 2,
		},
		ShowCategoryName: "Columnar Storage",
		UseCateGory:      true,
	}

	//18 Serverless-3
	res["Serverless Request Unit Cost"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Serverless",
		Category:     "Serverless Request Unit Cost",
		OrderMap: map[string]int32{
			"TiDB Serverless": 1,
			"Request Units":   3,
		},
		ShowCategoryName: "Request Units",
		UseCateGory:      true,
		MeasureUnit:      "RU",
	}
	//18 Support Plan
	res["Support Plan"] = entity.CategoryItemShow{
		Category:     "Support Plan",
		ShowKindName: "Support Plan",
		OrderMap: map[string]int32{
			"Support Plan": 5,
		},
		UseCateGory: true,
	}
	//19 Changefeed
	res["TiCDC Capacity Units"] = entity.CategoryItemShow{
		ShowKindName: "TiDB Dedicated",
		Category:     "TiCDC Capacity Units",
		Labels: map[string]string{
			"TiCDC Capacity Units": "Replication Capacity Units",
		},
		OrderMap: map[string]int32{
			"TiDB Dedicated":             2,
			"Changefeed":                 5,
			"Replication Capacity Units": 1,
		},
		LabelKey:         "TiCDC Capacity Units",
		ShowCategoryName: "Changefeed",
		UseCateGory:      true,
		MeasureUnit:      "CCU",
	}
	// 20
	res["Serverless Essential Column Storage Cost"] = entity.CategoryItemShow{
		Category:         "Serverless Essential Column Storage Cost",
		ShowKindName:     "TiDB Cloud Essential",
		ShowCategoryName: "Columnar Storage",
		OrderMap: map[string]int32{
			"Columnar Storage":     2,
			"TiDB Cloud Essential": 4,
		},
		UseCateGory: true,
	}
	// 21
	res["Serverless Starter Request Unit Cost"] = entity.CategoryItemShow{
		Category:         "Serverless Starter Request Unit Cost",
		ShowKindName:     "TiDB Cloud Starter",
		ShowCategoryName: "Request Units",
		OrderMap: map[string]int32{
			"Request Units":      3,
			"TiDB Cloud Starter": 3,
		},
		UseCateGory: true,
		MeasureUnit: "RU",
	}

	// 22
	res["Premium Backup Storage"] = entity.CategoryItemShow{
		Category:         "Premium Backup Storage",
		ShowKindName:     "TiDB Cloud Premium",
		ShowCategoryName: "Backup",
		OrderMap: map[string]int32{
			"Backup":                5,
			"TiDB Cloud Premium":    4,
			"Single Region Storage": 1,
		},
		LabelKey: "Premium Backup Storage",
		Labels: map[string]string{
			"Premium Backup Storage": "Single Region Storage",
		},
		UseCateGory: true,
	}

	return res
}

func CreateCategoryLabels() {
	categoryLabels := GetCategoryLabel()
	for _, categoryLabel := range categoryLabels {
		el := &entity.CategoryItemShow{
			ShowKindName:      categoryLabel.ShowKindName,
			Category:          categoryLabel.Category,
			Labels:            categoryLabel.Labels,
			LabelKey:          categoryLabel.LabelKey,
			OrderMap:          categoryLabel.OrderMap,
			ShowServicePrefix: categoryLabel.ShowServicePrefix,
			ShowCategoryName:  categoryLabel.ShowCategoryName,
			UseCateGory:       categoryLabel.UseCateGory,
			MeasureUnit:       categoryLabel.MeasureUnit,
		}
		err := el.Create(db.GetDB())
		panicIf.Error(err)
	}
}
