package structs

import (
	"time"
)

// structure for database

type GroupTasks struct {
	Id               string
	CreatorUserId    string
	Category         string
	GroupId          string
	GroupName        string
	Description      string // user-specific description for faster retrieval
	CurrentTasksStep uint8
	NumberOfSteps    uint8
	Status           uint8
	GlobalInputs     string `gorm:"type:json"`
	StartedAt        time.Time
	EndedAt          time.Time
	RememberId       string `gorm:"-"` // used by the web client who requested this to open the modal after the backend sent the NewGroupTaskStarted message
}

type GroupTaskSteps struct {
	Id             string
	GroupTasksId   string
	CreatorUserId  string
	Step           uint8
	Status         uint8
	Log            string `gorm:"type:text"`
	Inputs         string `gorm:"type:text"`
	Files          string `gorm:"type:text"`
	StartedAt      time.Time
	EndedAt        time.Time
	LockedByUserId string `gorm:"-"` // used by the web client to ensure that only one user can edit the input value
}

// read from file structure

type CategoryGroup struct {
	Category string  `json:"category"`
	Groups   []Group `json:"groups"`
}

type Group struct {
	Category     string         `json:"category"`
	Id           string         `json:"id"`
	Name         string         `json:"name"`
	GlobalInputs []GlobalInputs `json:"globalInputs"`
	Tasks        []Task         `json:"tasks"`
}

type GlobalInputs struct {
	ParameterName string `json:"parameterName"`
	Type          string `json:"type"`
	DisplayName   string `json:"displayName"`
}

type Task struct {
	Name           string          `json:"name"`
	OnFinish       string          `json:"onFinish"`
	UndoPossible   bool            `json:"undoPossible"`
	RepeatPossible bool            `json:"repeatPossible"`
	ScriptPath     string          `json:"scriptPath"`
	Parameters     []TaskParameter `json:"parameters"` // same as task inputs
}

type TaskParameter struct {
	ParameterName string `json:"parameterName"`
	Type          string `json:"type"`
	DisplayName   string `json:"displayName"`
	Global        bool   `json:"global"`
}

// used for ui when a user is writing into input field to lock the task step for other users
type LockedGroupTaskSteps struct {
	LockedByUserId string
	GroupTaskId    string
	Step           uint8
	LockedAt       time.Time
	RememberId     string
}

// used for ui when a user types into input fields to sync to other users and show them this when opening the group task view
type GroupTaskStepsInput struct {
	GroupTaskId   string
	Step          uint8
	ParameterName string
	Value         interface{}
}

type GroupTaskStepFile struct {
	OriginalFileName string // file name which was used by the python script
	SystemFileName   string // file name which was set by this server
}
