package address

import (
	"context"
	"gorm.io/gorm"

	"github.com/UpmeshLTD/urus-aio/infrastructure/db/entities"
)

type Repository interface {
	Get(ctx context.Context, db *gorm.DB, id int64) (*entities.Address, error)
	Create(ctx context.Context, db *gorm.DB, entity *entities.Address) (*entities.Address, error)
	Update(ctx context.Context, db *gorm.DB, id entities.ID, maps map[string]interface{}) error
}

type repositoryImpl struct {
}

func NewRepository() Repository {
	return &repositoryImpl{}
}

func (r *repositoryImpl) Get(ctx context.Context, db *gorm.DB, id int64) (*entities.Address, error) {
	var entity = &entities.Address{}
	if err := db.Preload("SubLevelLocations").First(&entity, id).Error; err != nil {
		return nil, err
	}
	return entity, nil
}

func (r *repositoryImpl) Create(ctx context.Context, db *gorm.DB, entity *entities.Address) (*entities.Address, error) {
	if err := db.Create(&entity).Error; err != nil {
		return nil, err
	}
	return entity, nil
}

func (r *repositoryImpl) Update(ctx context.Context, db *gorm.DB, id entities.ID, maps map[string]interface{}) error {
	if _, has := maps["SubLevelLocations"]; has {
		if err := db.Model(&entities.Address{BaseEntity: entities.BaseEntity{ID: id}}).Association("SubLevelLocations").Clear(); err != nil {
			return err
		}
	}
	return db.Model(&entities.Address{BaseEntity: entities.BaseEntity{ID: id}}).Preload("SubLevelLocations").Updates(maps).Error
}
