package repository import ( "apskel-pos-be/internal/entities" "context" "fmt" "github.com/google/uuid" "gorm.io/gorm" ) type GamePlayRepository struct { db *gorm.DB } func NewGamePlayRepository(db *gorm.DB) *GamePlayRepository { return &GamePlayRepository{db: db} } func (r *GamePlayRepository) Create(ctx context.Context, gamePlay *entities.GamePlay) error { return r.db.WithContext(ctx).Create(gamePlay).Error } func (r *GamePlayRepository) GetByID(ctx context.Context, id uuid.UUID) (*entities.GamePlay, error) { var gamePlay entities.GamePlay err := r.db.WithContext(ctx).Preload("Game").Preload("Customer").Preload("Prize").Where("id = ?", id).First(&gamePlay).Error if err != nil { return nil, err } return &gamePlay, nil } func (r *GamePlayRepository) List(ctx context.Context, offset, limit int, search string, gameID, customerID, prizeID *uuid.UUID, sortBy, sortOrder string) ([]entities.GamePlay, int64, error) { var gamePlays []entities.GamePlay var total int64 query := r.db.WithContext(ctx).Preload("Game").Preload("Customer").Preload("Prize") if search != "" { searchTerm := "%" + search + "%" query = query.Joins("JOIN customers ON game_plays.customer_id = customers.id"). Where("customers.name ILIKE ? OR customers.email ILIKE ?", searchTerm, searchTerm) } if gameID != nil { query = query.Where("game_id = ?", *gameID) } if customerID != nil { query = query.Where("customer_id = ?", *customerID) } if prizeID != nil { query = query.Where("prize_id = ?", *prizeID) } if err := query.Model(&entities.GamePlay{}).Count(&total).Error; err != nil { return nil, 0, err } if sortBy != "" { if sortOrder == "" { sortOrder = "asc" } query = query.Order(fmt.Sprintf("game_plays.%s %s", sortBy, sortOrder)) } else { query = query.Order("game_plays.created_at DESC") } err := query.Offset(offset).Limit(limit).Find(&gamePlays).Error if err != nil { return nil, 0, err } return gamePlays, total, nil } func (r *GamePlayRepository) Update(ctx context.Context, gamePlay *entities.GamePlay) error { return r.db.WithContext(ctx).Save(gamePlay).Error } func (r *GamePlayRepository) Delete(ctx context.Context, id uuid.UUID) error { return r.db.WithContext(ctx).Delete(&entities.GamePlay{}, id).Error } func (r *GamePlayRepository) GetCustomerPlays(ctx context.Context, customerID uuid.UUID, limit int) ([]entities.GamePlay, error) { var gamePlays []entities.GamePlay err := r.db.WithContext(ctx).Preload("Game").Preload("Prize"). Where("customer_id = ?", customerID). Order("created_at DESC"). Limit(limit). Find(&gamePlays).Error if err != nil { return nil, err } return gamePlays, nil } func (r *GamePlayRepository) GetGameStats(ctx context.Context, gameID uuid.UUID) (map[string]interface{}, error) { var stats map[string]interface{} err := r.db.WithContext(ctx).Model(&entities.GamePlay{}). Select("COUNT(*) as total_plays, SUM(token_used) as total_tokens_used"). Where("game_id = ?", gameID). Scan(&stats).Error if err != nil { return nil, err } return stats, nil }