package job

import (
	"system-altrak/internal/domain"
	"system-altrak/internal/repository"

	"gorm.io/gorm"
)

type JobRepository interface {
	Create(job *domain.BackgroundJob) error
	Update(job *domain.BackgroundJob) error
	GetByID(id uint) (*domain.BackgroundJob, error)
	ListActive(branchID uint) ([]domain.BackgroundJob, error)
	ListAll(page, limit int, branchID uint) ([]domain.BackgroundJob, int64, error)
}

type repositoryImpl struct {
	db *gorm.DB
}

func NewRepository(base *repository.Repository) JobRepository {
	return &repositoryImpl{db: base.GetDB()}
}

func (r *repositoryImpl) Create(job *domain.BackgroundJob) error {
	return r.db.Create(job).Error
}

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

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

func (r *repositoryImpl) ListActive(branchID uint) ([]domain.BackgroundJob, error) {
	var jobs []domain.BackgroundJob
	q := r.db.Where("status IN ?", []string{"PENDING", "PROCESSING"})
	if branchID > 0 {
		q = q.Where("branch_id = ?", branchID)
	}
	err := q.Order("created_at DESC").Find(&jobs).Error
	return jobs, err
}

func (r *repositoryImpl) ListAll(page, limit int, branchID uint) ([]domain.BackgroundJob, int64, error) {
	var jobs []domain.BackgroundJob
	var total int64

	q := r.db.Model(&domain.BackgroundJob{})
	if branchID > 0 {
		q = q.Where("branch_id = ?", branchID)
	}
	q.Count(&total)

	offset := (page - 1) * limit
	err := q.Order("created_at DESC").Limit(limit).Offset(offset).Find(&jobs).Error

	return jobs, total, err
}
