package service

import (
	"context"
	"errors"
	"fmt"

	"git.itzana.me/strafesnet/go-grpc/maps"
	"git.itzana.me/strafesnet/maps-service/pkg/api"
	"git.itzana.me/strafesnet/maps-service/pkg/datastore"
	"github.com/nats-io/nats.go"
)

var (
	// ErrPermissionDenied caller does not have the required role
	ErrPermissionDenied = errors.New("Permission denied")
	// ErrUserInfo user info is missing for some reason
	ErrUserInfo = errors.New("Missing user info")
	ErrDelayReset = errors.New("Please give the validator at least 10 seconds to operate before attempting to reset the status")
	ErrPermissionDeniedNotSubmitter = fmt.Errorf("%w: You must be the submitter to perform this action", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleSubmissionRelease = fmt.Errorf("%w: Need Role SubmissionRelease", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleMapUpload = fmt.Errorf("%w: Need Role MapUpload", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleMapReview = fmt.Errorf("%w: Need Role MapReview", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleMapDownload = fmt.Errorf("%w: Need Role MapDownload", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleScriptWrite = fmt.Errorf("%w: Need Role ScriptWrite", ErrPermissionDenied)
	ErrPermissionDeniedNeedRoleMaptest = fmt.Errorf("%w: Need Role Maptest", ErrPermissionDenied)
)

type Service struct {
	DB   datastore.Datastore
	Nats nats.JetStreamContext
	Client maps.MapsServiceClient
}

// NewError creates *ErrorStatusCode from error returned by handler.
//
// Used for common default response.
func (svc *Service) NewError(ctx context.Context, err error) *api.ErrorStatusCode {
	status := 500
	if errors.Is(err, datastore.ErrNotExist) {
		status = 404
	}
	if errors.Is(err, ErrPermissionDenied) {
		status = 403
	}
	if errors.Is(err, ErrUserInfo) {
		status = 401
	}
	return &api.ErrorStatusCode{
		StatusCode: status,
		Response: api.Error{
			Code:    int64(status),
			Message: err.Error(),
		},
	}
}