package repositories

import (
	"time"

	configs "astrology-api/configs"
	storedto "astrology-api/dto/store"
	storemodel "astrology-api/models/usermodel"

	"gorm.io/gorm"
)

type StoreRepository struct {
	db *gorm.DB
}

func NewStoreRepository() *StoreRepository {
	return &StoreRepository{
		db: configs.DB,
	}
}

func (r *StoreRepository) GetHomeBanners() ([]storedto.BannerResponse, error) {

	var banners []storemodel.Banner

	err := r.db.
		Where("bannerTypeId = ?", 2).
		Where("isActive = ?", true).
		Where("isDelete = ?", false).
		Where("fromDate <= ?", time.Now()).
		Where("toDate >= ?", time.Now()).
		Order("id DESC").
		Find(&banners).Error

	if err != nil {
		return nil, err
	}

	response := make([]storedto.BannerResponse, 0)

	for _, b := range banners {

		response = append(response, storedto.BannerResponse{
			ID:           b.ID,
			BannerImage:  b.BannerImage,
			BannerTypeID: b.BannerTypeID,
		})
	}

	return response, nil
}

func (r *StoreRepository) GetProductCategories() ([]storedto.CategoryResponse, error) {

	var categories []storemodel.ProductCategory

	err := r.db.
		Where("isActive = ?", true).
		Where("isDelete = ?", false).
		Order("displayOrder ASC").
		Find(&categories).Error

	if err != nil {
		return nil, err
	}

	response := make([]storedto.CategoryResponse, 0)

	for _, c := range categories {
		displayOrder := 0
		if c.DisplayOrder != nil {
			displayOrder = *c.DisplayOrder
		}

		response = append(response, storedto.CategoryResponse{
			ID:            c.ID,
			Name:          c.Name,
			DisplayOrder:  displayOrder,
			CategoryImage: c.CategoryImage,
		})

	}

	return response, nil
}

func (r *StoreRepository) GetTrendingProducts() ([]storedto.ProductResponse, error) {

	var products []storemodel.AstromallProduct

	err := r.db.
		Where("isActive = ?", true).
		Where("isDelete = ?", false).
		Order("id DESC").
		Limit(10).
		Find(&products).Error

	if err != nil {
		return nil, err
	}

	response := make([]storedto.ProductResponse, 0)

	for _, p := range products {
		description := ""
		if p.Description != nil {
			description = *p.Description
		}

		response = append(response, storedto.ProductResponse{
			ID:                p.ID,
			Name:              p.Name,
			Features:          p.Features,
			ProductImage:      p.ProductImage,
			ProductCategoryID: p.ProductCategoryID,
			Amount:            p.Amount,
			Description:       description,
		})
	}

	return response, nil
}

func (r *StoreRepository) GetTopSellingProducts() ([]storedto.ProductResponse, error) {

	var products []storemodel.AstromallProduct

	err := r.db.
		Where("isActive = ?", true).
		Where("isDelete = ?", false).
		Order("id DESC").
		Limit(10).
		Find(&products).Error

	if err != nil {
		return nil, err
	}

	response := make([]storedto.ProductResponse, 0)

	for _, p := range products {
		description := ""
		if p.Description != nil {
			description = *p.Description
		}

		response = append(response, storedto.ProductResponse{
			ID:                p.ID,
			Name:              p.Name,
			Features:          p.Features,
			ProductImage:      p.ProductImage,
			ProductCategoryID: p.ProductCategoryID,
			Amount:            p.Amount,
			Description:       description,
		})
	}

	return response, nil
}


func (r *StoreRepository) GetNewLaunchProducts() ([]storedto.ProductResponse, error) {

	var products []storemodel.AstromallProduct

	err := r.db.
		Where("isActive = ?", true).
		Where("isDelete = ?", false).
		Order("created_at DESC").
		Limit(10).
		Find(&products).Error

	if err != nil {
		return nil, err
	}

	response := make([]storedto.ProductResponse, 0)

	for _, p := range products {
		description := ""
		if p.Description != nil {
			description = *p.Description
		}

		response = append(response, storedto.ProductResponse{
			ID:                p.ID,
			Name:              p.Name,
			Features:          p.Features,
			ProductImage:      p.ProductImage,
			ProductCategoryID: p.ProductCategoryID,
			Amount:            p.Amount,
			Description:       description,
		})
	}

	return response, nil
}

func (r *StoreRepository) GetStoreStatistics() (storedto.StoreStatisticsResponse, error) {

	stats := storedto.StoreStatisticsResponse{
		Orders:    437891,
		Rating:    4.72,
		Experts:   7663,
		InSession: 7590,
	}

	return stats, nil
}