package sjr

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

type SJRRepository interface {
	CreateAuthorization(auth *domain.ServiceAuthorization) error
	GetAuthorizationByID(id uint, branchID uint, role string) (*domain.ServiceAuthorization, error)
	ListAuthorizations(branchID uint, role string) ([]domain.ServiceAuthorization, error)
	FetchSerialSequence(docType string, year, month int) (int, error)
	UpdateAuthorization(auth *domain.ServiceAuthorization) error
	DeleteRecord(id uint, branchID uint, role string) error
}

type repositoryImpl struct {
	base *repository.Repository
}

func NewRepository(base *repository.Repository) SJRRepository {
	return &repositoryImpl{base: base}
}

func (r *repositoryImpl) CreateAuthorization(auth *domain.ServiceAuthorization) error {
	return r.base.GetDB().Create(auth).Error
}

func (r *repositoryImpl) GetAuthorizationByID(id uint, branchID uint, role string) (*domain.ServiceAuthorization, error) {
	var auth domain.ServiceAuthorization
	q := r.base.GetDB()
	if role != "superadmin" && branchID > 0 {
		q = q.Where("branch_id = ?", branchID)
	}
	err := q.First(&auth, id).Error
	return &auth, err
}

func (r *repositoryImpl) ListAuthorizations(branchID uint, role string) ([]domain.ServiceAuthorization, error) {
	var list []domain.ServiceAuthorization
	q := r.base.GetDB().Order("created_at desc")
	if role != "superadmin" && branchID > 0 {
		q = q.Where("branch_id = ?", branchID)
	}
	err := q.Find(&list).Error
	return list, err
}

func (r *repositoryImpl) FetchSerialSequence(docType string, year, month int) (int, error) {
	return r.base.GetNextSequence(docType, year, month)
}

func (r *repositoryImpl) UpdateAuthorization(auth *domain.ServiceAuthorization) error {
	return r.base.GetDB().Save(auth).Error
}

func (r *repositoryImpl) DeleteRecord(id uint, branchID uint, role string) error {
	q := r.base.GetDB().Where("id = ?", id)
	if role != "superadmin" && branchID > 0 {
		q = q.Where("branch_id = ?", branchID)
	}
	return q.Delete(&domain.ServiceAuthorization{}).Error
}
