package config

import (
	"testing"

	"github.com/databricks/cli/bundle/config/paths"
	"github.com/databricks/cli/bundle/config/resources"
	"github.com/stretchr/testify/assert"
)

func TestVerifyUniqueResourceIdentifiers(t *testing.T) {
	r := Resources{
		Jobs: map[string]*resources.Job{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo.yml",
				},
			},
		},
		Models: map[string]*resources.MlflowModel{
			"bar": {
				Paths: paths.Paths{
					ConfigFilePath: "bar.yml",
				},
			},
		},
		Experiments: map[string]*resources.MlflowExperiment{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo2.yml",
				},
			},
		},
	}
	_, err := r.VerifyUniqueResourceIdentifiers()
	assert.ErrorContains(t, err, "multiple resources named foo (job at foo.yml, mlflow_experiment at foo2.yml)")
}

func TestVerifySafeMerge(t *testing.T) {
	r := Resources{
		Jobs: map[string]*resources.Job{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo.yml",
				},
			},
		},
		Models: map[string]*resources.MlflowModel{
			"bar": {
				Paths: paths.Paths{
					ConfigFilePath: "bar.yml",
				},
			},
		},
	}
	other := Resources{
		Pipelines: map[string]*resources.Pipeline{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo2.yml",
				},
			},
		},
	}
	err := r.VerifySafeMerge(&other)
	assert.ErrorContains(t, err, "multiple resources named foo (job at foo.yml, pipeline at foo2.yml)")
}

func TestVerifySafeMergeForSameResourceType(t *testing.T) {
	r := Resources{
		Jobs: map[string]*resources.Job{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo.yml",
				},
			},
		},
		Models: map[string]*resources.MlflowModel{
			"bar": {
				Paths: paths.Paths{
					ConfigFilePath: "bar.yml",
				},
			},
		},
	}
	other := Resources{
		Jobs: map[string]*resources.Job{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo2.yml",
				},
			},
		},
	}
	err := r.VerifySafeMerge(&other)
	assert.ErrorContains(t, err, "multiple resources named foo (job at foo.yml, job at foo2.yml)")
}

func TestVerifySafeMergeForRegisteredModels(t *testing.T) {
	r := Resources{
		Jobs: map[string]*resources.Job{
			"foo": {
				Paths: paths.Paths{
					ConfigFilePath: "foo.yml",
				},
			},
		},
		RegisteredModels: map[string]*resources.RegisteredModel{
			"bar": {
				Paths: paths.Paths{
					ConfigFilePath: "bar.yml",
				},
			},
		},
	}
	other := Resources{
		RegisteredModels: map[string]*resources.RegisteredModel{
			"bar": {
				Paths: paths.Paths{
					ConfigFilePath: "bar2.yml",
				},
			},
		},
	}
	err := r.VerifySafeMerge(&other)
	assert.ErrorContains(t, err, "multiple resources named bar (registered_model at bar.yml, registered_model at bar2.yml)")
}
