package repositories

import (
	models "astrology-api/models/usermodel"

	"gorm.io/gorm"
)

type OrderAddressRepository interface {

	// Create
	AddOrderAddress(tx *gorm.DB, address *models.OrderAddress) error

	// Update
	UpdateOrderAddress(tx *gorm.DB, address *models.OrderAddress) error

	// Find By ID
	GetOrderAddressByID(id uint) (*models.OrderAddress, error)

	// User Address List
	GetOrderAddresses(userID uint, search string) ([]models.OrderAddress, error)
}

type orderAddressRepository struct {
	db *gorm.DB
}

func NewOrderAddressRepository(db *gorm.DB) OrderAddressRepository {
	return &orderAddressRepository{
		db: db,
	}
}

//
// Create Address
//
func (r *orderAddressRepository) AddOrderAddress(tx *gorm.DB, address *models.OrderAddress) error {

	if tx == nil {
		tx = r.db
	}

	return tx.Create(address).Error
}

//
// Update Address
//
func (r *orderAddressRepository) UpdateOrderAddress(tx *gorm.DB, address *models.OrderAddress) error {

	if tx == nil {
		tx = r.db
	}

	return tx.Save(address).Error
}

//
// Get Address By ID
//
func (r *orderAddressRepository) GetOrderAddressByID(id uint) (*models.OrderAddress, error) {

	var address models.OrderAddress

	err := r.db.
		Where("id = ? AND isDelete = ?", id, false).
		First(&address).Error

	if err != nil {
		return nil, err
	}

	return &address, nil
}

//
// Get User Address List
//
func (r *orderAddressRepository) GetOrderAddresses(userID uint, search string) ([]models.OrderAddress, error) {

	var addresses []models.OrderAddress

	query := r.db.
		Model(&models.OrderAddress{}).
		Where("userId = ?", userID).
		Where("isDelete = ?", false).
		Where("isActive = ?", true)

	if search != "" {
		query = query.Where("name LIKE ?", "%"+search+"%")
	}

	err := query.
		Order("id DESC").
		Find(&addresses).Error

	if err != nil {
		return nil, err
	}

	return addresses, nil
}