package utils

import (
	"encoding/json"
	"time"

	"github.com/pingcap/errors"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

const (
	TiDBClusterMetadataAnnKey = "cluster.tidbcloud.com/metadata"

	TiDBBranchMetadataAnnKey = "branch.tidbcloud.com/metadata"
)

type BranchMetadata struct {
	ID          string    `json:"id,omitempty"`
	Name        string    `json:"name,omitempty"`
	TenantID    uint64    `json:"tenant-id,omitempty"`
	ProjectID   uint64    `json:"project-id,omitempty"`
	CreatedAt   time.Time `json:"created-at,omitempty"`
	CreatedByID uint64    `json:"created-by-id,omitempty"`
	Salt        []byte    `json:"salt,omitempty"`
}

func GetBranchMetadata(branch *cloudv1.Branch) (*BranchMetadata, error) {
	v := branch.Annotations[TiDBBranchMetadataAnnKey]
	if v == "" {
		return nil, errors.New("empty TiDBClusterMetadataAnnKey")
	}

	metadata := &BranchMetadata{}
	if err := json.Unmarshal([]byte(v), metadata); err != nil {
		return nil, err
	}

	return metadata, nil
}

type ClusterMetadata struct {
	ID          uint64    `json:"id,omitempty"`
	Name        string    `json:"name,omitempty"`
	TenantID    uint64    `json:"tenant-id,omitempty"`
	ProjectID   uint64    `json:"project-id,omitempty"`
	CreatedAt   time.Time `json:"created-at,omitempty"`
	CreatedByID uint64    `json:"created-by-id,omitempty"`
	Salt        []byte    `json:"salt,omitempty"`
}

func UpdateMap(m map[string]string, key, value string) map[string]string {
	if m == nil {
		m = make(map[string]string)
	}
	m[key] = value
	return m
}
