package user

import (
	"system-altrak/internal/domain"

	"gorm.io/gorm"
)

type UserRepository interface {
	List() ([]domain.User, error)
	GetByID(id uint) (*domain.User, error)
	Create(user *domain.User) error
	Update(user *domain.User) error
	Delete(id uint) error
	CountByRole(role string) (int64, error)
}

type repositoryImpl struct {
	db *gorm.DB
}

func NewRepository(db *gorm.DB) UserRepository {
	return &repositoryImpl{db: db}
}

func (r *repositoryImpl) List() ([]domain.User, error) {
	var users []domain.User
	err := r.db.Order("created_at desc").Find(&users).Error
	return users, err
}

func (r *repositoryImpl) GetByID(id uint) (*domain.User, error) {
	var user domain.User
	err := r.db.First(&user, id).Error
	return &user, err
}

func (r *repositoryImpl) Create(user *domain.User) error {
	return r.db.Create(user).Error
}

func (r *repositoryImpl) Update(user *domain.User) error {
	return r.db.Save(user).Error
}

func (r *repositoryImpl) Delete(id uint) error {
	return r.db.Delete(&domain.User{}, id).Error
}

func (r *repositoryImpl) CountByRole(role string) (int64, error) {
	var count int64
	err := r.db.Model(&domain.User{}).Where("LOWER(role) = LOWER(?)", role).Count(&count).Error
	return count, err
}
