package matertals

import "github.com/rs/zerolog/log"

type MaterialProperties struct {
	Density float64 	//Плотность (кг / м3)
	Tougnness float64 	//Ударная вязкость, мера скорости поглощения энергии без деформаций, джоули на квадратный метр в секунду
	Brittleness float64  //Хрупкость - обратная пластичности (в основном за счет внешних эффектов), джоули на квадртаный метр, после которых раскол
	MeltingPoint float64 //точка перехода из твердого в жидкое, градусы Цельсия при нормальном давлении
	BoilingPoint float64 //точка кипения - из жидкого в газ, градусы Цельсия при нормальном давлении
	Conductivity bool //проводимость эл. тока
}

//агрегатное состояние
type MatterState int

const (
	Solid   MatterState = iota //кристаллическая решетка
	Liquid
	Gas
	Plasma

	Glass //нет кристаллической решетки, аморфный
)

var transitions = map[MatterState][]MatterState{
	Solid: {Liquid, Gas},
	Liquid: {Solid, Gas, Glass},
	Gas: {Solid, Plasma},
	Plasma: {Gas},

	Glass: {Liquid},

}

func (ms MatterState) Change(from MatterState, to MatterState) bool {
	if from == to {
		return true
	}

	_, ok := transitions[from]

	if ok {
		newStateFound := func(lst []MatterState, to MatterState) bool {
			for _, b := range lst {
				if b == to {
					return true
				}
			}
			return false
		}(transitions[from], to)
		if !newStateFound {
			log.Warn().Msgf(`Transition %d -> %d is impossible`, from, to)
			return false
		}
		// check temperatures/conditions, see template
		/*
			Solid -> Gas     Sublimation
			Solid -> Liquid  Melting

			Liquid -> Gas    Boiling
			Liquid -> Solid  Freezing

			Gas -> Solid     Deposition
			Gas -> Liquid    Condensation

			Gas -> Plasma    Ionization
		 	Plasma -> Gas    Recombination
		 */
	}

	//При фазовом переходе первого рода скачкообразно изменяются самые главные, первичные экстенсивные параметры:
	// удельный объём,
	// количество запасённой внутренней энергии,
	// концентрация компонентов и т. п.
	//
	// Фазовые переходы второго рода происходят в тех случаях, когда меняется симметрия строения вещества
	// (симметрия может полностью исчезнуть или понизиться).

	return true

}
