/**
 * @brief Examples of building models using Sample class.
 *
 * @author Yunhai Li (liyunhai1016@hotmail.com)
 *
 * @copyright Copyright (c) 2024, TBPLaS develop team.
 */
#ifndef TBPLAS_TESTS_MODEL_SAMPLE_H
#define TBPLAS_TESTS_MODEL_SAMPLE_H

#include <tuple>

#include "builder/sample.h"

namespace tbplas::tests {

using base::complex_t;
using builder::Sample;
using sample_t = Sample<complex_t>;

/**
 * @brief Make a large graphene sample.
 * 
 * @param[in] t hopping integral in eV
 * @param[in] a C-C bond length in NM
 * @param[in] with_onsite whether to use non-zero onsite energies
 * @param[in] dim dimension of the sample
 * @return graphene sample with given dimension 
 */
sample_t make_graphene_sample(
    double t = -2.7,
    double a = 0.142,
    bool with_onsite = false,
    const std::tuple<int, int, int>& dim = { 1024, 1024, 1 });

/**
 * @brief Make twisted bi-layer graphene (tbg).
 * 
 * @param[in] tbg_idx index of twisting angle
 * @return tbg sample
 */
sample_t make_tbg_sample(int tbg_idx = 5);

/**
 * @brief Make quasi-crystal sample with given radius.
 * 
 * @param[in] radius radius of quasi-crystal in NM
 * @return quasi-crystal sample
 */
sample_t make_quasi_crystal_sample(double radius = 3.0);

/**
 * @brief Make square sierpinski carpet sample.
 * 
 * @param[in] iteration of the sample
 * @return square sierpinski carpet sample
 */
sample_t make_fractal_sample(int iteration = 3);

} // namespace tbplas::tests
#endif