package iom

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

type IOMRepository interface {
	CreateMemorandum(memo *domain.Memorandum) error
	GetMemorandumByID(id uint, branchID uint, role string) (*domain.Memorandum, error)
	ListMemorandums(branchID uint, role string) ([]domain.Memorandum, error)
	GetNextSequence(docType string, year, month int) (int, error)
	DeleteMemorandum(id uint, branchID uint, role string) error
}

type repositoryImpl struct {
	base *repository.Repository
}

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

func (r *repositoryImpl) CreateMemorandum(memo *domain.Memorandum) error {
	return r.base.GetDB().Create(memo).Error
}

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

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

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

func (r *repositoryImpl) DeleteMemorandum(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.Memorandum{}).Error
}
