package types

import (
	"time"

	"gorm.io/gorm"
)

type MedicionTipo uint8

const (
	MedicionMedio MedicionTipo = iota + 1
	MedicionCola
)

var (
	MedicionTipoString = map[MedicionTipo]string{
		MedicionMedio: "MEDIO",
		MedicionCola:  "COLA",
	}
)

type MasaUnitaria struct {
	Longitud float64
	Peso     float64
	GramosMM float64
}

type EspesoresAlas struct {
	LadoMotorSup    float64
	LadoMotorInf    float64
	LadoOperadorSup float64
	LadoOperadorInf float64
}

type AsimetriaAlma struct {
	LadoMotorSup    float64
	LadoMotorInf    float64
	LadoOperadorSup float64
	LadoOperadorInf float64
}

type AnchuraAlas struct {
	LadoMotor    float64
	LadoOperador float64
}

type Mediciones struct {
	MedicionID    uint64 `gorm:"primaryKey;autoIncrement:true"`
	POrderNo      int    `gorm:"index"`
	Observaciones string
	Colada        string
	MedicionTipo  MedicionTipo
	MasaUnitaria  MasaUnitaria `gorm:"embedded;embeddedPrefix:masa_unitaria_"`
	AlturaPerfil  float64
	EspesorAlma   float64
	EspesoresAlas EspesoresAlas `gorm:"embedded;embeddedPrefix:espesor_alas_"`
	AnchuraAlas   AnchuraAlas   `gorm:"embedded;embeddedPrefix:anchura_alas_"`
	AsimetriaAlma AsimetriaAlma `gorm:"embedded;embeddedPrefix:asimetria_alma_"`
	Firmada       bool
	Operador      string
	Enraye        bool
	MarcaCelsa    bool
	Turno         string
	IDBarra       string
	Producto      string
	Calidad       string
	CreatedAt     time.Time
	UpdatedAt     time.Time
	DeletedAt     gorm.DeletedAt `gorm:"index"`
}

func (m *Mediciones) GetMedicionTipo() string {
	return MedicionTipoString[m.MedicionTipo]
}

func (m *Mediciones) BeforeCreate(tx *gorm.DB) (err error) {
	m.CreatedAt = time.Now()
	m.UpdatedAt = time.Now()
	return
}

func (m *Mediciones) BeforeUpdate(tx *gorm.DB) (err error) {
	m.UpdatedAt = time.Now()
	return
}

type GetMedicionReq struct {
	Sender     string
	MedicionID uint64
	TimeStamp  string
}

type GetMedicionRes struct {
	Medicion  *Mediciones
	TimeStamp string
}

type GetMedicionesReq struct {
	Sender    string
	POrderNo  int
	TimeStamp string
}

type GetMedicionesRes struct {
	Mediciones []Mediciones
	TimeStamp  string
}

type PostMedicionesReq struct {
	Sender    string
	Medicion  *Mediciones
	TimeStamp string
}

type PostMedicionesRes struct {
	Message   string
	TimeStamp string
}
