package services

import (
	"context"
	"testing"

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

func TestItemService_CsvImport(t *testing.T) {
	data := loadcsv()
	svc := &ItemService{
		repo: tRepos,
	}
	err := svc.CsvImport(context.Background(), tGroup.ID, data)
	assert.NoError(t, err)

	items, err := svc.GetAll(context.Background(), tGroup.ID)
	assert.NoError(t, err)
	t.Cleanup(func() {
		for _, item := range items {
			err := svc.repo.Items.Delete(context.Background(), item.ID)
			assert.NoError(t, err)
		}
	})

	assert.Equal(t, len(items), 6)

	dataCsv := []csvRow{}
	for _, item := range data {
		dataCsv = append(dataCsv, newCsvRow(item))
	}

	locationService := &LocationService{
		repos: tRepos,
	}

	LabelService := &LabelService{
		repos: tRepos,
	}

	allLocation, err := locationService.GetAll(context.Background(), tGroup.ID)
	assert.NoError(t, err)
	locNames := []string{}
	for _, loc := range allLocation {
		locNames = append(locNames, loc.Name)
	}

	allLabels, err := LabelService.GetAll(context.Background(), tGroup.ID)
	assert.NoError(t, err)
	labelNames := []string{}
	for _, label := range allLabels {
		labelNames = append(labelNames, label.Name)
	}

	ids := []uuid.UUID{}
	t.Cleanup((func() {
		for _, id := range ids {
			err := svc.repo.Items.Delete(context.Background(), id)
			assert.NoError(t, err)
		}
	}))

	for _, item := range items {
		assert.Contains(t, locNames, item.Location.Name)
		for _, label := range item.Labels {
			assert.Contains(t, labelNames, label.Name)
		}

		for _, csvRow := range dataCsv {
			if csvRow.Item.Name == item.Name {
				assert.Equal(t, csvRow.Item.Description, item.Description)
				assert.Equal(t, csvRow.Item.Quantity, item.Quantity)
				assert.Equal(t, csvRow.Item.Insured, item.Insured)
			}
		}
	}
}