################################################################################
#
#   module LatPhysBandstructures
#   -> LatticePhysics_Base
#   -> LatticePhysics_ReciprocalSpace
#   -> LinearAlgebra
#
#   --> Definition of Bond Hamiltonians
#   --> Definition of Hamiltonians
#   --> Definition of Bandstructures
#
################################################################################










module LatPhysBandstructures


# Dependencies
using LatPhysBase
using LatPhysReciprocal
using LinearAlgebra
using Distributed
using Random
using HDF5




# BOND HAMILTONIANS

# Abstract type definition
include("bond_hamiltonian/abstract_bond_hamiltonian.jl")

# Concrete Hamiltonian: Sum of two Hamiltonians
include("bond_hamiltonian/concrete_bond_hamiltonian_sum.jl")

# Concrete Hamiltonian: Heisenberg
include("bond_hamiltonian/concrete_bond_spin_hamiltonian_heisenberg.jl")
# Concrete Hamiltonian: Kitaev
include("bond_hamiltonian/concrete_bond_spin_hamiltonian_kitaev.jl")

# Concrete Hamiltonian: Simple Hopping Hamiltonian (independent on label of bonds)
include("bond_hamiltonian/concrete_bond_hopping_hamiltonian_simple.jl")
# Concrete Hamiltonian: Simple Hopping Hamiltonian (NN)
include("bond_hamiltonian/concrete_bond_hopping_hamiltonian_simple_NN.jl")
# Concrete Hamiltonian: Simple Hopping Hamiltonian (NN)
include("bond_hamiltonian/concrete_bond_hopping_hamiltonian_dict.jl")


#= generate fancy syntax of passing the bond to the object directly
for H in Base.subtypes(AbstractBondHamiltonian)
    function (hb::H)(b :: AbstractBond)
        # return the bond term function
        return bondterm(hb, b)
    end
end =#




# HAMILTONIANS

# Abstract type definition
include("hamiltonian/abstract_hamiltonian.jl")

# Concrete type definition
include("hamiltonian/concrete_hamiltonian.jl")




# BANDSTRUCTURE

# Abstract type definition
include("bandstructure/abstract_bandstructure.jl")

# Concrete type definition
include("bandstructure/concrete_bandstructure.jl")




# CONSTANT ENERGY MANIFOLD

# Abstract type definition
include("energy_manifold/abstract_energy_manifold.jl")

# Concrete type definition
include("energy_manifold/concrete_energy_manifold.jl")

end # module
