package tester

import (
	"context"

	"git.sch9.ru/new_gate/ms-tester/internal/models"
)

type ProblemUseCase interface {
	CreateProblem(ctx context.Context, title string) (int32, error)
	ReadProblemById(ctx context.Context, id int32) (*models.Problem, error)
	DeleteProblem(ctx context.Context, id int32) error
	ListProblems(ctx context.Context, filter models.ProblemsFilter) (*models.ProblemsList, error)
	UpdateProblem(ctx context.Context, id int32, problem models.ProblemUpdate) error
	UploadProblem(ctx context.Context, id int32, archive []byte) error
}

type ContestUseCase interface {
	CreateContest(ctx context.Context, title string) (int32, error)
	ReadContestById(ctx context.Context, id int32) (*models.Contest, error)
	DeleteContest(ctx context.Context, id int32) error
	AddTask(ctx context.Context, contestId int32, taskId int32) (int32, error)
	DeleteTask(ctx context.Context, taskId int32) error
	AddParticipant(ctx context.Context, contestId int32, userId int32) (int32, error)
	DeleteParticipant(ctx context.Context, participantId int32) error
	ReadTasks(ctx context.Context, contestId int32) ([]*models.TasksListItem, error)
	ListContests(ctx context.Context, filter models.ContestsFilter) (*models.ContestsList, error)
	ListParticipants(ctx context.Context, filter models.ParticipantsFilter) (*models.ParticipantsList, error)
	UpdateContest(ctx context.Context, id int32, contestUpdate models.ContestUpdate) error
	UpdateParticipant(ctx context.Context, id int32, participantUpdate models.ParticipantUpdate) error
	ReadSolution(ctx context.Context, id int32) (*models.Solution, error)
	CreateSolution(ctx context.Context, creation *models.SolutionCreation) (int32, error)
	ListSolutions(ctx context.Context, filter models.SolutionsFilter) (*models.SolutionsList, error)
	ReadTask(ctx context.Context, id int32) (*models.Task, error)
	ReadMonitor(ctx context.Context, id int32) (*models.Monitor, error)
	ReadBestSolutions(ctx context.Context, contestId int32, participantId int32) ([]*models.Solution, error)
}