package common

import (
	"time"

	// "github.com/jinzhu/gorm"
	"github.com/jinzhu/gorm/dialects/postgres"
)

type Simulator struct {
	//gorm.Model
	ID            uint   `gorm:"primary_key;auto_increment"`
	UUID          string `gorm:"unique;not null"`
	Host          string `gorm:"default:''"`
	Modeltype     string `gorm:"default:''"`
	Uptime        int    `gorm:"default:0"`
	State         string `gorm:"default:''"`
	StateUpdateAt time.Time
	Properties    postgres.Jsonb // TODO: default value?
	RawProperties postgres.Jsonb // TODO: default value?
}

type File struct {
	//gorm.Model
	ID          uint   `gorm:"primary_key;auto_increment"`
	Name        string `gorm:"not null"`
	Path        string `gorm:"not null"`
	Type        string `gorm:"not null"`
	Size        uint   `gorm:"not null"`
	ImageHeight uint   // only required in case file is an image
	ImageWidth  uint   // only required in case file is an image
	Date        time.Time

	//remove belongs to User relation
	//User   User `gorm:"not null;association_autoupdate:false"`
	//UserID uint `gorm:"not null"`

	//new in villasweb 2.0
	ModelID uint `gorm:""`
	WidgetID uint `gorm:""`
}

type Project struct {
	//gorm.Model
	ID   uint   `gorm:"primary_key;auto_increment"`
	Name string `gorm:"not null"`

	User   User `gorm:"not null;association_autoupdate:false"`
	UserID uint `gorm:"not null"`

	Simulation   Simulation `gorm:"not null;association_autoupdate:false"`
	SimulationID uint       `gorm:"not null"`

	Visualizations []Visualization `gorm:"association_autoupdate:false"`
}

type Simulation struct {
	//gorm.Model
	ID              uint           `gorm:"primary_key;auto_increment"`
	Name            string         `gorm:"not null"`
	Running         bool           `gorm:"default:false"`
	StartParameters postgres.Jsonb // TODO default value

	User   User `gorm:"not null;association_autoupdate:false"`
	UserID uint `gorm:"not null"`

	Models   []Model `gorm:"foreignkey:BelongsToSimulationID;association_autoupdate:false"`
	Projects []Project         `gorm:"association_autoupdate:false"`
}

type Model struct {
	//gorm.Model
	ID              uint           `gorm:"primary_key;auto_increment"`
	Name            string         `gorm:"not null"`
	OutputLength    int            `gorm:"default:1"`
	InputLength     int            `gorm:"default:1"`
	StartParameters postgres.Jsonb // TODO: default value?

	BelongsToSimulation   Simulation `gorm:"not null;association_autoupdate:false"`
	BelongsToSimulationID uint       `gorm:"not null"`

	BelongsToSimulator   Simulator `gorm:"not null;association_autoupdate:false"`
	BelongsToSimulatorID uint      `gorm:"not null"`
	// NOTE: order of samples is important
	OutputMapping []Sample `gorm:""`
	InputMapping  []Sample `gorm:""`

	//new in villasweb 2.0 (for CIM file of simulation model and other model file formats)
	Files 			[]File 			`gorm:""`

}

type User struct {
	//gorm.Model
	ID       uint   `gorm:"primary_key;auto_increment"`
	Username string `gorm:"unique;not null"`
	Password string `gorm:"not null"`
	Mail     string `gorm:"default:''"`
	Role     string `gorm:"default:'user'"`

	Projects    []Project    `gorm:"association_autoupdate:false"`
	Simulations []Simulation `gorm:"association_autoupdate:false"`

	//remove has many files relation
	//Files       []File       `gorm:""`
}

type Visualization struct {
	//gorm.Model
	ID   uint   `gorm:"primary_key;auto_increment"`
	Name string `gorm:"not null"`
	Grid int    `gorm:"default:15"`

	Project   Project `gorm:"not null;association_autoupdate:false"`
	ProjectID uint    `gorm:"not null"`

	User   User `gorm:"not null;association_autoupdate:false"`
	UserID uint `gorm:"not null"`

	Widgets []Widget `gorm:""`
}

type Sample struct {
	//gorm.Model
	ID                uint   `gorm:"primary_key;auto_increment"`
	Name              string `gorm:"not null"`
	Unit              string `gorm:"not null"`
	Index			  uint 	 `gorm:"not null"`
	Direction		  string `gorm:"not null"`
	ModelID uint
	//IsRecorded			bool 			`gorm:"default:false"`
}

type Widget struct {
	//gorm.Model
	ID               uint           `gorm:"primary_key;auto_increment"`
	Name             string         `gorm:"not null"`
	Type             string         `gorm:"not null"`
	Width            uint           `gorm:"not null"`
	Height           uint           `gorm:"not null"`
	MinWidth         uint           `gorm:"not null"`
	MinHeight        uint           `gorm:"not null"`
	X                int            `gorm:"not null"`
	Y                int            `gorm:"not null"`
	Z                int            `gorm:"not null"`
	IsLocked         bool           `gorm:"default:false"`
	CustomProperties postgres.Jsonb // TODO: default value?
	VisualizationID  uint
	//new in villasweb 2.0
	Files 			 []File			`gorm:""`
}