package model

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

type mockDependencyRequirement struct {
	dimensions  map[string]string
	isDedicated bool
}

// unless here
func (m mockDependencyRequirement) Type() string {
	return ""
}
func (m mockDependencyRequirement) Dimensions() map[string]string {
	return m.dimensions
}
func (m mockDependencyRequirement) IsDedicated() bool {
	return m.isDedicated
}

func TestRequirementsStats_AddRequirement(t *testing.T) {
	var stats RequirementsStats

	req1 := mockDependencyRequirement{
		dimensions:  map[string]string{"key1": "value1"},
		isDedicated: true,
	}

	req2 := mockDependencyRequirement{
		dimensions:  map[string]string{"key1": "value1"},
		isDedicated: false,
	}

	req3 := mockDependencyRequirement{
		dimensions:  map[string]string{"key1": "value2"},
		isDedicated: true,
	}
	req4 := mockDependencyRequirement{
		dimensions:  map[string]string{"key1": "value2"},
		isDedicated: true,
	}

	// Add first requirement
	stats.AddRequirement(req1)
	assert.Len(t, stats, 1)
	assert.Equal(t, []bool{true}, stats[0].StatusOfIsDedicated)

	// Add second requirement with the same dimensions
	stats.AddRequirement(req2)
	assert.Len(t, stats, 1)
	assert.ElementsMatch(t, []bool{true, false}, stats[0].StatusOfIsDedicated)

	// Add third requirement with different dimensions
	stats.AddRequirement(req3)
	assert.Len(t, stats, 2)
	assert.ElementsMatch(t, []bool{true}, stats[1].StatusOfIsDedicated)
	assert.ElementsMatch(t, []bool{true, false}, stats[0].StatusOfIsDedicated)

	stats.AddRequirement(req4)
	assert.Len(t, stats, 2)
	assert.ElementsMatch(t, []bool{true, true}, stats[1].StatusOfIsDedicated)
	assert.ElementsMatch(t, []bool{true, false}, stats[0].StatusOfIsDedicated)
}

func TestRequirementsStats_ToEntitiesStats(t *testing.T) {
	stats := RequirementsStats{
		{
			Dimensions:          map[string]string{"key1": "value1"},
			StatusOfIsDedicated: []bool{true},
		},
		{
			Dimensions:          map[string]string{"key1": "value2"},
			StatusOfIsDedicated: []bool{false},
		},
		{
			Dimensions:          map[string]string{"key1": "value3"},
			StatusOfIsDedicated: []bool{true, true},
		},
		{
			Dimensions:          map[string]string{"key1": "value4"},
			StatusOfIsDedicated: []bool{false, false},
		},
		{
			Dimensions:          map[string]string{"key1": "value5"},
			StatusOfIsDedicated: []bool{true, false, false, false},
		},
		{
			Dimensions:          map[string]string{"key1": "value6"},
			StatusOfIsDedicated: []bool{true, true, false, false},
		},
	}

	result := stats.ToEntitiesStats()
	assert.Len(t, result, 6, "Should have 6 entries")
	assert.Equal(t, result[0].Number, 1, "Should have 1")
	assert.Equal(t, result[1].Number, 1, "Should have 1")
	assert.Equal(t, result[2].Number, 2, "Should have 2")
	assert.Equal(t, result[3].Number, 1, "Should have 1")
	assert.Equal(t, result[4].Number, 2, "Should have 2")
	assert.Equal(t, result[5].Number, 3, "Should have 3")
}
