package sql

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

	"gorm.io/gorm"
)

type countryRepository struct {
	*BaseRepositoryImpl[domain.Country]
	db *gorm.DB
}

// NewCountryRepository creates a new CountryRepository.
func NewCountryRepository(db *gorm.DB, cfg *config.Config) domain.CountryRepository {
	return &countryRepository{
		BaseRepositoryImpl: NewBaseRepositoryImpl[domain.Country](db, cfg),
		db:                 db,
	}
}

// GetByCode finds a country by code
func (r *countryRepository) GetByCode(ctx context.Context, code string) (*domain.Country, error) {
	var country domain.Country
	if err := r.db.WithContext(ctx).Where("code = ?", code).First(&country).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return nil, domain.ErrEntityNotFound
		}
		return nil, err
	}
	return &country, nil
}

// ListByContinent finds countries by continent
func (r *countryRepository) ListByContinent(ctx context.Context, continent string) ([]domain.Country, error) {
	var countries []domain.Country
	if err := r.db.WithContext(ctx).Where("continent = ?", continent).Find(&countries).Error; err != nil {
		return nil, err
	}
	return countries, nil
}