/**
 * @brief Functions for making graphene primitive cell.
 *
 * @author Yunhai Li (liyunhai1016@hotmail.com)
 *
 * @copyright Copyright (c) 2024, TBPLaS develop team.
 *
 * @note Functions are converted from Python version by calling print_cxx().
 */

#ifndef TBPLAS_MATERIALS_GRAPHENE_H

#include "base/datatypes.h"
#include "builder/primitive.h"

namespace tbplas::materials {
using tbplas::base::complex_t;
using tbplas::builder::PrimitiveCell;

/**
 * @brief Make graphene primitive cell in diamond shape.
 * 
 * @param[in] c length of c-axis in NANOMETER
 * @param[in] t hopping integral in eV
 * @return graphene primitive cell
 */
[[nodiscard]] PrimitiveCell<complex_t>
make_graphene_diamond(double c = 1.0, complex_t t = -2.7);

/**
 * @brief Make graphene cell in rectangular shape.
 * 
 * @param[in] c length of c-axis in NANOMETER
 * @param[in] t hopping integral in eV
 * @return rectangular graphene cell
 */
[[nodiscard]] PrimitiveCell<complex_t>
make_graphene_rect(double c = 1.0, complex_t t = -2.7);

/**
 * @brief Make 8-band graphene primitive cell.
 * 
 * @param[in] c length of c-axis in NANOMETER
 * @return graphene primitive cell
 */
[[nodiscard]] PrimitiveCell<complex_t>
make_graphene_sp(double c = 1.0);

/**
 * @brief Generate Kane-Mele model of graphene
 * 
 * @param[in] is_qsh whether is the model is in quantum spin Hall phase
 * @return primitive cell of graphene
 */
[[nodiscard]] PrimitiveCell<complex_t>
make_graphene_soc(bool is_qsh = true);
} // namespace tbplas::materials

#define TBPLAS_MATERIALS_GRAPHENE_H
#endif