package entity

import (
	"os"
	"testing"

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

func TestAlbum_Yaml(t *testing.T) {
	t.Run("berlin-2019", func(t *testing.T) {
		m := AlbumFixtures.Get("berlin-2019")

		if found := m.Find(); found == nil {
			t.Fatal("should find album")
		} else {
			m = *found
		}

		result, err := m.Yaml()

		if err != nil {
			t.Fatal(err)
		}

		t.Logf("YAML: %s", result)
	})
	t.Run("christmas2030", func(t *testing.T) {
		m := AlbumFixtures.Get("christmas2030")

		if found := m.Find(); found == nil {
			t.Fatal("should find album")
		} else {
			m = *found
		}

		result, err := m.Yaml()

		if err != nil {
			t.Fatal(err)
		}

		t.Logf("YAML: %s", result)
	})
}

func TestAlbum_SaveAsYaml(t *testing.T) {
	t.Run("berlin-2019", func(t *testing.T) {
		m := AlbumFixtures.Get("berlin-2019")

		if found := m.Find(); found == nil {
			t.Fatal("should find album")
		} else {
			m = *found
		}

		fileName := m.YamlFileName("testdata")

		if err := m.SaveAsYaml(fileName); err != nil {
			t.Fatal(err)
		}

		if err := m.LoadFromYaml(fileName); err != nil {
			t.Fatal(err)
		}

		if err := os.Remove(fileName); err != nil {
			t.Fatal(err)
		}
	})
}

func TestAlbum_LoadFromYaml(t *testing.T) {
	t.Run("berlin-2020", func(t *testing.T) {
		fileName := "testdata/album/at9lxuqxpoaaaaaa.yml"

		m := Album{}

		if err := m.LoadFromYaml(fileName); err != nil {
			t.Fatal(err)
		}

		if err := m.Save(); err != nil {
			t.Fatal(err)
		}

		a := Album{AlbumUID: "at9lxuqxpoaaaaaa"}

		if found := a.Find(); found == nil {
			t.Fatal("should find album")
		} else {
			a = *found
		}

		if existingYaml, err := os.ReadFile(fileName); err != nil {
			t.Fatal(err)
		} else if newYaml, err := a.Yaml(); err != nil {
			t.Fatal(err)
		} else {
			assert.Equal(t, existingYaml[:50], newYaml[:50])
			assert.Equal(t, a.AlbumUID, m.AlbumUID)
			assert.Equal(t, a.AlbumSlug, m.AlbumSlug)
			assert.Equal(t, a.AlbumType, m.AlbumType)
			assert.Equal(t, a.AlbumTitle, m.AlbumTitle)
			assert.Equal(t, a.AlbumDescription, m.AlbumDescription)
			assert.Equal(t, a.AlbumOrder, m.AlbumOrder)
			assert.Equal(t, a.AlbumCountry, m.AlbumCountry)
			assert.Equal(t, a.CreatedAt, m.CreatedAt)
			assert.Equal(t, a.UpdatedAt, m.UpdatedAt)
			assert.Equal(t, len(a.Photos), len(m.Photos))
		}
	})
}

func TestAlbum_YamlFileName(t *testing.T) {
	t.Run("berlin-2019", func(t *testing.T) {
		m := AlbumFixtures.Get("berlin-2019")

		if found := m.Find(); found == nil {
			t.Fatal("should find album")
		} else {
			m = *found
		}

		fileName := m.YamlFileName("/foo/bar")

		assert.Equal(t, "/foo/bar/album/at9lxuqxpogaaba9.yml", fileName)
	})
}
