package product_repository

import (
	"chonho/internal/api-v1/entity"
	"chonho/pkg/model"
	"encoding/json"
)

func (r *repository) SaveProduct(prod *model.Product) error {
	return r.db.Save(prod).Error
}

func (r *repository) UpdateProduct(id int64, attributes map[string]interface{}) error {
	return r.db.Model(&model.Product{
		Id: id,
	}).UpdateColumns(attributes).Error
}

func (r *repository) SaveStoreProduct(prod *model.StoreProduct) error {
	return r.db.Save(prod).Error
}

func (r *repository) UpdateStoreProduct(id int64, prod *model.StoreProduct) error {
	return r.db.Model(&model.StoreProduct{
		Id: id,
	}).Updates(prod).Error
}

func (r *repository) SaveStockChange(stockChange *model.StoreInventoryHistory) error {
	return r.db.Save(stockChange).Error
}

func (r *repository) FirstProduct(filter ProductFilter) (*model.Product, error) {
	var product model.Product
	builder := r.db.Model(&product)
	if filter.ProductId != 0 {
		builder = builder.Where("id = ?", filter.ProductId)
	}
	if filter.UserId != 0 {
		builder = builder.Where("user_id = ?", filter.UserId)
	}
	err := builder.First(&product).Error
	if err != nil {
		return nil, err
	}
	return &product, nil
}

func (r *repository) FirstStoreProduct(filter ProductFilter) (*model.StoreProduct, error) {
	var product model.StoreProduct
	builder := r.db.Model(&product)
	if filter.ProductId != 0 {
		builder = builder.Where("product_id = ?", filter.ProductId)
	}
	if filter.StoreId != 0 {
		builder = builder.Where("store_id = ?", filter.StoreId)
	}
	err := builder.First(&product).Error
	if err != nil {
		return nil, err
	}
	return &product, nil
}

func (r *repository) FindSellerProduct(filter *ProductFilter) ([]entity.SellerProduct, error) {
	var result []entity.SellerProduct
	builder := r.db.Table("stores AS s").
		Joins("JOIN store_products AS sp ON sp.store_id = s.id").
		Joins("JOIN products AS p ON p.id = sp.product_id")

	if filter.ApartmentId != 0 {
		builder = builder.Where("s.apartment_id = ?", filter.ApartmentId)
	}

	if filter.SellerId != 0 {
		builder = builder.Where("s.user_id = ?", filter.SellerId)
	}

	if filter.StockLessThan != nil {
		builder = builder.Where("sp.stock <= ?", filter.StockLessThan)
	}

	if filter.StockGreater != nil {
		builder = builder.Where("sp.stock >= ?", filter.StockGreater)
	}

	if filter.ProductId != 0 {
		builder = builder.Where("p.id = ? ", filter.ProductId)
	}

	if len(filter.Status) != 0 {
		builder = builder.Where("p.status IN ?", filter.Status)
	}

	if filter.Name != "" {
		builder = builder.Where("p.name LIKE ? ", "%"+filter.Name+"%")
	}

	err := builder.Select(`
		p.id,
		p.name,
		p.category_id,
		p.thumbnail,
		p.images,
		p.description,
		p.status,
		p.unit,
		p.is_quote_after_ordering,
		sp.store_id,
		sp.stock,
		sp.price,
		sp.delivery_type,
		sp.delivery_commit_time
    `).Find(&result).Error
	if err != nil {
		return nil, err
	}
	for i, e := range result {
		var imageArr []string
		if err := json.Unmarshal([]byte(e.Images), &imageArr); err != nil {
			result[i].ImagesArray = []string{}
		} else {
			result[i].ImagesArray = imageArr
		}
	}
	return result, nil
}
