package adminkindboxreqvalidator

import (
	"context"
	"errors"
	"fmt"

	"git.gocasts.ir/ebhomengo/niki/entity"
	errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg"
)

const (
	MinKindBoxReq = 1
	MaxKindBoxReq = 100
)

type Repository interface {
	KindBoxRequestExist(id uint) (bool, error)
	GetByID(ctx context.Context, id uint) (entity.KindBoxReq, error)
}

type Validator struct {
	repo Repository
}

func New(repo Repository) Validator {
	return Validator{repo: repo}
}

func (v Validator) doesKindBoxRequestExist(value interface{}) error {
	kindboxreqID, ok := value.(uint)
	if !ok {
		return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong)
	}
	if isExist, err := v.repo.KindBoxRequestExist(kindboxreqID); !isExist || err != nil {
		if err != nil {
			return err
		}
		if !isExist {
			return errors.New("kind box request is not exist")
		}
	}

	return nil
}

func (v Validator) CheckKindBoxReqStatusForAccepting(value interface{}) error {
	kindboxreqID, ok := value.(uint)
	if !ok {
		return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong)
	}
	kindBox, err := v.repo.GetByID(context.Background(), kindboxreqID)
	if err != nil {
		return err
	}
	if kindBox.Status != entity.KindBoxReqPendingStatus {
		return fmt.Errorf(errmsg.ErrorMsgAcceptKindBoxReqStatus)
	}

	return nil
}

func (v Validator) CheckKindBoxReqStatusForRejecting(value interface{}) error {
	kindboxreqID, ok := value.(uint)
	if !ok {
		return fmt.Errorf(errmsg.ErrorMsgSomethingWentWrong)
	}
	kindBox, err := v.repo.GetByID(context.Background(), kindboxreqID)
	if err != nil {
		return err
	}
	if kindBox.Status != entity.KindBoxReqPendingStatus {
		return fmt.Errorf(errmsg.ErrorMsgRejectKindBoxReqStatus)
	}

	return nil
}
