package models

import "time"

type Solution struct {
	Id int32 `db:"id"`

	ParticipantId   int32  `db:"participant_id"`
	ParticipantName string `db:"participant_name"`

	Solution string `db:"solution"`

	State      int32 `db:"state"`
	Score      int32 `db:"score"`
	Penalty    int32 `db:"penalty"`
	TimeStat   int32 `db:"time_stat"`
	MemoryStat int32 `db:"memory_stat"`
	Language   int32 `db:"language"`

	TaskId       int32  `db:"task_id"`
	TaskPosition int32  `db:"task_position"`
	TaskTitle    string `db:"task_title"`

	ContestId    int32  `db:"contest_id"`
	ContestTitle string `db:"contest_title"`

	UpdatedAt time.Time `db:"updated_at"`
	CreatedAt time.Time `db:"created_at"`
}

type SolutionCreation struct {
	Solution      string
	TaskId        int32
	ParticipantId int32
	Language      int32
	Penalty       int32
}

type SolutionsListItem struct {
	Id int32 `db:"id"`

	ParticipantId   int32  `db:"participant_id"`
	ParticipantName string `db:"participant_name"`

	State      int32 `db:"state"`
	Score      int32 `db:"score"`
	Penalty    int32 `db:"penalty"`
	TimeStat   int32 `db:"time_stat"`
	MemoryStat int32 `db:"memory_stat"`
	Language   int32 `db:"language"`

	TaskId       int32  `db:"task_id"`
	TaskPosition int32  `db:"task_position"`
	TaskTitle    string `db:"task_title"`

	ContestId    int32  `db:"contest_id"`
	ContestTitle string `db:"contest_title"`

	UpdatedAt time.Time `db:"updated_at"`
	CreatedAt time.Time `db:"created_at"`
}

type SolutionsList struct {
	Solutions  []*SolutionsListItem
	Pagination Pagination
}

type SolutionsFilter struct {
	Page          int32
	PageSize      int32
	ContestId     *int32
	ParticipantId *int32
	TaskId        *int32
	Language      *int32
	State         *int32
	Order         *int32
}

func (f SolutionsFilter) Offset() int32 {
	return (f.Page - 1) * f.PageSize
}

//type Result int32
//
//const (
//	NotTested               Result = 1 // change only with schema change
//	Accepted                Result = 2
//	WrongAnswer             Result = 3
//	PresentationError       Result = 4
//	CompilationError        Result = 5
//	MemoryLimitExceeded     Result = 6
//	TimeLimitExceeded       Result = 7
//	RuntimeError            Result = 8
//	SystemFailDuringTesting Result = 9
//	Testing                 Result = 10
//)
//
//var ErrBadResult = errors.New("bad result")
//
//func (result Result) Valid() error {
//	switch result {
//	case NotTested, Accepted, TimeLimitExceeded, MemoryLimitExceeded, CompilationError, SystemFailDuringTesting:
//		return nil
//	}
//	return ErrBadResult
//}
//
//type Language struct {
//	Name       string
//	CompileCmd []string //source: src;result:executable
//	RunCmd     []string //source: executable
//}
//
//var Languages = []Language{
//	{Name: "gcc std=c90",
//		CompileCmd: []string{"gcc", "src", "-std=c90", "-o", "executable"},
//		RunCmd:     []string{"executable"}},
//}