package linguistics_test

import (
	"context"
	"testing"

	"tercul/internal/domain"
	"tercul/internal/jobs/linguistics"
	"tercul/internal/testutil"

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

type AnalysisRepositoryTestSuite struct {
	testutil.IntegrationTestSuite
	repo linguistics.AnalysisRepository
}

func (s *AnalysisRepositoryTestSuite) SetupSuite() {
	s.IntegrationTestSuite.SetupSuite(testutil.DefaultTestConfig())
	s.repo = linguistics.NewGORMAnalysisRepository(s.DB)
}

func (s *AnalysisRepositoryTestSuite) SetupTest() {
	s.IntegrationTestSuite.SetupTest()
}

func (s *AnalysisRepositoryTestSuite) TestGetAnalysisData() {
	s.Run("should return the correct analysis data", func() {
		// Arrange
		work := s.CreateTestWork(s.AdminCtx, "Test Work", "en", "Test content")
		textMetadata := &domain.TextMetadata{WorkID: work.ID, WordCount: 123}
		readabilityScore := &domain.ReadabilityScore{WorkID: work.ID, Score: 45.6}
		languageAnalysis := &domain.LanguageAnalysis{
			WorkID: work.ID,
			Analysis: domain.JSONB{
				"sentiment": 0.5678,
			},
		}
		s.DB.Create(textMetadata)
		s.DB.Create(readabilityScore)
		s.DB.Create(languageAnalysis)

		// Act
		returnedMetadata, returnedScore, returnedAnalysis, err := s.repo.GetAnalysisData(context.Background(), work.ID)

		// Assert
		s.Require().NoError(err)
		s.Require().NotNil(returnedMetadata)
		s.Require().NotNil(returnedScore)
		s.Require().NotNil(returnedAnalysis)

		s.Equal(textMetadata.WordCount, returnedMetadata.WordCount)
		s.Equal(readabilityScore.Score, returnedScore.Score)
		sentiment, ok := returnedAnalysis.Analysis["sentiment"].(float64)
		s.Require().True(ok)
		s.Equal(0.5678, sentiment)
	})
}

func TestAnalysisRepository(t *testing.T) {
	suite.Run(t, new(AnalysisRepositoryTestSuite))
}
