package main

import (
	"regexp"
)

// layerFilter filter cluster configs that are not related to this commit
type layerFilter struct {
	version map[string]bool
	tenants map[string]map[string]bool
}

func newLayerFilter(files []string) *layerFilter {
	filter := &layerFilter{
		version: make(map[string]bool),
		tenants: make(map[string]map[string]bool),
	}

	for _, f := range files {
		v := getVerison(f)
		if v != "" {
			filter.version[v] = true
		}

		t, c := getTenantClusterID(f)
		if t != "" {
			if filter.tenants[t] == nil {
				filter.tenants[t] = map[string]bool{}
			}
			filter.tenants[t][c] = true
		}

	}

	return filter

}

func getVerison(file string) string {

	if file == "" {
		return ""
	}

	// e.g. versions/v6.6.0/instances/gcp.n2-standard-8/tikv.toml
	appIDRegex := regexp.MustCompile(`versions/(.*?)/`)
	matchs := appIDRegex.FindStringSubmatch(file)

	if len(matchs) >= 2 {
		return matchs[1]
	}
	return ""
}

func getTenantClusterID(file string) (string, string) {
	tenantID := ""
	clusterID := ""

	if file == "" {
		return tenantID, clusterID
	}

	// e.g. tenants/tenant-30060/clusters/cluster-150378/meta.yaml
	appIDRegex := regexp.MustCompile(`tenants/tenant-(.*?)/clusters/cluster-(.*?)/`)
	matchs := appIDRegex.FindStringSubmatch(file)

	if len(matchs) > 1 {
		tenantID = matchs[1]
	}

	if len(matchs) > 2 {
		clusterID = matchs[2]
	}

	return tenantID, clusterID
}

func (f *layerFilter) filterLayter(l layer) bool {
	if f.version[l.Version] {
		return true
	}

	if l.Tenant != nil {
		if f.tenants[*l.Tenant] == nil {
			return false
		}

		if l.Cluster != nil {
			if f.tenants[*l.Tenant][*l.Cluster] || filter.tenants[*l.Tenant][""] {
				return true
			}
		}
	}

	return false
}

func (f *layerFilter) filterLayters(l layers) bool {

	cc, err := l.render()
	if err != nil {
		return false
	}

	if f.version[cc.Spec.Version] {
		return true
	}

	if l.Tenant != nil {
		if f.tenants[*l.Tenant] == nil {
			return false
		}

		if l.Cluster != nil {
			if f.tenants[*l.Tenant][*l.Cluster] || f.tenants[*l.Tenant][""] {
				return true
			}
		}
	}

	return false
}
