// Code generated by ogen, DO NOT EDIT.

package api

import (
	"context"
)

// Handler handles operations described by OpenAPI v3 specification.
type Handler interface {
	// ActionSubmissionPublish implements actionSubmissionPublish operation.
	//
	// Role Validator changes status from Publishing -> Published.
	//
	// PATCH /submissions/{SubmissionID}/status/publish
	ActionSubmissionPublish(ctx context.Context, params ActionSubmissionPublishParams) error
	// ActionSubmissionReject implements actionSubmissionReject operation.
	//
	// Role Reviewer changes status from Submitted -> Rejected.
	//
	// PATCH /submissions/{SubmissionID}/status/reject
	ActionSubmissionReject(ctx context.Context, params ActionSubmissionRejectParams) error
	// ActionSubmissionRequestChanges implements actionSubmissionRequestChanges operation.
	//
	// Role Reviewer changes status from Validated|Accepted|Submitted -> ChangesRequested.
	//
	// PATCH /submissions/{SubmissionID}/status/request-changes
	ActionSubmissionRequestChanges(ctx context.Context, params ActionSubmissionRequestChangesParams) error
	// ActionSubmissionRevoke implements actionSubmissionRevoke operation.
	//
	// Role Submitter changes status from Submitted|ChangesRequested -> UnderConstruction.
	//
	// PATCH /submissions/{SubmissionID}/status/revoke
	ActionSubmissionRevoke(ctx context.Context, params ActionSubmissionRevokeParams) error
	// ActionSubmissionSubmit implements actionSubmissionSubmit operation.
	//
	// Role Submitter changes status from UnderConstruction|ChangesRequested -> Submitted.
	//
	// PATCH /submissions/{SubmissionID}/status/submit
	ActionSubmissionSubmit(ctx context.Context, params ActionSubmissionSubmitParams) error
	// ActionSubmissionTriggerPublish implements actionSubmissionTriggerPublish operation.
	//
	// Role Admin changes status from Validated -> Publishing.
	//
	// PATCH /submissions/{SubmissionID}/status/trigger-publish
	ActionSubmissionTriggerPublish(ctx context.Context, params ActionSubmissionTriggerPublishParams) error
	// ActionSubmissionTriggerValidate implements actionSubmissionTriggerValidate operation.
	//
	// Role Reviewer triggers validation and changes status from Submitted|Accepted -> Validating.
	//
	// PATCH /submissions/{SubmissionID}/status/trigger-validate
	ActionSubmissionTriggerValidate(ctx context.Context, params ActionSubmissionTriggerValidateParams) error
	// ActionSubmissionValidate implements actionSubmissionValidate operation.
	//
	// Role Validator changes status from Validating -> Validated.
	//
	// PATCH /submissions/{SubmissionID}/status/validate
	ActionSubmissionValidate(ctx context.Context, params ActionSubmissionValidateParams) error
	// CreateSubmission implements createSubmission operation.
	//
	// Create new submission.
	//
	// POST /submissions
	CreateSubmission(ctx context.Context, req OptSubmissionCreate) (*ID, error)
	// GetSubmission implements getSubmission operation.
	//
	// Retrieve map with ID.
	//
	// GET /submissions/{SubmissionID}
	GetSubmission(ctx context.Context, params GetSubmissionParams) (*Submission, error)
	// ListSubmissions implements listSubmissions operation.
	//
	// Get list of submissions.
	//
	// GET /submissions
	ListSubmissions(ctx context.Context, params ListSubmissionsParams) ([]Submission, error)
	// PatchSubmissionCompleted implements patchSubmissionCompleted operation.
	//
	// Retrieve map with ID.
	//
	// PATCH /submissions/{SubmissionID}/completed
	PatchSubmissionCompleted(ctx context.Context, params PatchSubmissionCompletedParams) error
	// PatchSubmissionModel implements patchSubmissionModel operation.
	//
	// Update model following role restrictions.
	//
	// PATCH /submissions/{SubmissionID}/model
	PatchSubmissionModel(ctx context.Context, params PatchSubmissionModelParams) error
	// NewError creates *ErrorStatusCode from error returned by handler.
	//
	// Used for common default response.
	NewError(ctx context.Context, err error) *ErrorStatusCode
}

// Server implements http server based on OpenAPI v3 specification and
// calls Handler to handle requests.
type Server struct {
	h   Handler
	sec SecurityHandler
	baseServer
}

// NewServer creates new Server.
func NewServer(h Handler, sec SecurityHandler, opts ...ServerOption) (*Server, error) {
	s, err := newServerConfig(opts...).baseServer()
	if err != nil {
		return nil, err
	}
	return &Server{
		h:          h,
		sec:        sec,
		baseServer: s,
	}, nil
}