package sql

import (
	"context"
	"tercul/internal/domain"
	"tercul/internal/platform/config"

	"go.opentelemetry.io/otel"
	"go.opentelemetry.io/otel/trace"
	"gorm.io/gorm"
)

type localizationRepository struct {
	db     *gorm.DB
	tracer trace.Tracer
}

func NewLocalizationRepository(db *gorm.DB, cfg *config.Config) domain.LocalizationRepository {
	return &localizationRepository{
		db:     db,
		tracer: otel.Tracer("localization.repository"),
	}
}

func (r *localizationRepository) GetTranslation(ctx context.Context, key string, language string) (string, error) {
	ctx, span := r.tracer.Start(ctx, "GetTranslation")
	defer span.End()
	var l domain.Localization
	err := r.db.WithContext(ctx).Where("key = ? AND language = ?", key, language).First(&l).Error
	if err != nil {
		return "", err
	}
	return l.Value, nil
}

func (r *localizationRepository) GetTranslations(ctx context.Context, keys []string, language string) (map[string]string, error) {
	ctx, span := r.tracer.Start(ctx, "GetTranslations")
	defer span.End()
	var localizations []domain.Localization
	err := r.db.WithContext(ctx).Where("key IN ? AND language = ?", keys, language).Find(&localizations).Error
	if err != nil {
		return nil, err
	}
	result := make(map[string]string)
	for _, l := range localizations {
		result[l.Key] = l.Value
	}
	return result, nil
}

func (r *localizationRepository) GetAuthorBiography(ctx context.Context, authorID uint, language string) (string, error) {
	ctx, span := r.tracer.Start(ctx, "GetAuthorBiography")
	defer span.End()
	var translation domain.Translation
	err := r.db.WithContext(ctx).
		Where("translatable_type = ? AND translatable_id = ? AND language = ?", "authors", authorID, language).
		First(&translation).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return "", nil
		}
		return "", err
	}
	return translation.Content, nil
}

func (r *localizationRepository) GetWorkContent(ctx context.Context, workID uint, language string) (string, error) {
	var translation domain.Translation
	err := r.db.WithContext(ctx).
		Where("translatable_type = ? AND translatable_id = ? AND language = ?", "works", workID, language).
		First(&translation).Error
	if err != nil {
		if err == gorm.ErrRecordNotFound {
			return "", nil
		}
		return "", err
	}
	return translation.Content, nil
}
