package tester

import (
	"context"
	"database/sql"
	"git.sch9.ru/new_gate/ms-tester/internal/models"
	"github.com/jmoiron/sqlx"
)

type Querier interface {
	Rebind(query string) string
	QueryxContext(ctx context.Context, query string, args ...interface{}) (*sqlx.Rows, error)
	GetContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error
	ExecContext(ctx context.Context, query string, args ...any) (sql.Result, error)
	SelectContext(ctx context.Context, dest interface{}, query string, args ...interface{}) error
}

type Tx interface {
	Querier
	Commit() error
	Rollback() error
}

type ProblemPostgresRepository interface {
	BeginTx(ctx context.Context) (Tx, error)
	DB() Querier
	CreateProblem(ctx context.Context, q Querier, title string) (int32, error)
	ReadProblemById(ctx context.Context, q Querier, id int32) (*models.Problem, error)
	DeleteProblem(ctx context.Context, q Querier, id int32) error
	ListProblems(ctx context.Context, q Querier, page int32, pageSize int32) ([]*models.ProblemListItem, int32, error)
	UpdateProblem(ctx context.Context, q Querier, id int32, heading models.ProblemUpdate) error
}

type ContestRepository 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
	ReadRichTasks(ctx context.Context, contestId int32) ([]*models.RichTask, error)
	ListContests(ctx context.Context, page int32, pageSize int32) ([]*models.ContestsListItem, int32, error)
	ListParticipants(ctx context.Context, contestId int32, page int32, pageSize int32) ([]*models.ParticipantsListItem, int32, error)
	UpdateContest(ctx context.Context, id int32, contestUpdate models.ContestUpdate) error
}