"""
MDSuite: A Zincwarecode package.

License
-------
This program and the accompanying materials are made available under the terms
of the Eclipse Public License v2.0 which accompanies this distribution, and is
available at https://www.eclipse.org/legal/epl-v20.html

SPDX-License-Identifier: EPL-2.0

Copyright Contributors to the Zincwarecode Project.

Contact Information
-------------------
email: zincwarecode@gmail.com
github: https://github.com/zincware
web: https://zincwarecode.com/

Citation
--------
If you use this module please cite us with:

Summary
-------
"""
from dataclasses import dataclass

standard_state_pressure = 100000  # Pa -- Standard state pressure
avogadro_constant = 6.02214076e23  # mol^-1 -- Avogadro's constant
elementary_charge = 1.602176634e-19  # C -- Elementary charge
boltzmann_constant = 1.380649e-23  # J K^-1 --  Boltzmann constant
hyperfine_transition_frequency = (
    9192631770  # Hz -- Hyperfine transition frequency of Cs-133
)
luminous_efficacy = 683  # lm W^-1 -- Luminous efficacy
planck_constant = 6.62607015e-34  # J Hz^-1 -- Planck constant
reduced_planck_constant = 1.054571817e-34  # J s -- Reduced Planck constant
speed_of_light = 299792458  # m s^-1 -- Speed of light in a vacuum
gravity = 9.80665  # m s^-2 -- Standard acceleration due to gravity on earth
atmosphere = 101325  # Pa -- Standard atmospheric pressure
golden_ratio = 1.618033988749895  # The golden ratio as taken from scipy


@dataclass()
class Units:
    """
    Dataclass for the units.
    """

    time: float
    length: float
    energy: float
    NkTV2p: float
    boltzmann: float
    temperature: float
    pressure: float
    avogadro: float = 6.02214076e23
    elementary_charge: float = 1.602176634e-19


real = Units(
    time=1e-15,
    length=1e-10,
    energy=4184 / 6.02214076e23,
    NkTV2p=68568.415,
    boltzmann=0.0019872067,
    temperature=1,
    pressure=101325.0,
)


metal = Units(
    time=1e-12,
    length=1e-10,
    energy=1.6022e-19,
    NkTV2p=1.6021765e6,
    boltzmann=8.617343e-5,
    temperature=1,
    pressure=100000,
)


si = Units(
    time=1,
    length=1,
    energy=1,
    NkTV2p=1.380649e-23,
    boltzmann=1.386049e-23,
    temperature=1,
    pressure=1,
)


units_dict = {"real": real, "metal": metal, "si": si}
