#ifndef _CTSQL_HPP
#define _CTSQL_HPP

#include <cstdlib>
#include <string>

// -------------------------------------------------------------------------
// fixed_string

template<std::size_t N>
struct fixed_string; 

// operator==(fixed_string, fixed_string) - to be implemented

// -------------------------------------------------------------------------
// column

template<fixed_string Name, typename T>
struct column;

// -------------------------------------------------------------------------
// table

template<typename... Columns>
struct table;

// -------------------------------------------------------------------------
// Predicates

template<fixed_string Name, auto Value>
struct greater;

template<fixed_string Name, auto Value>
struct equals;

// -------------------------------------------------------------------------
// column_type_t

template<typename Table, fixed_string Name>
using column_type_t = ... // to be implemented 

// -------------------------------------------------------------------------
// query

template<typename Table>
struct query {

  // select
	template<fixed_string... Names>
	using select = ... // to be implemented

  // where
	template<typename Predicate>
	using where = ... // to be implemented
};

// -------------------------------------------------------------------------
// basic test

using Users = table<
    column<"id", int>,
    column<"name", std::string>,
    column<"age", int>
>;

using Q =
    query<Users>
    ::select<"name", "age">
    ::where<greater<"age", 18>>;

#endif // _CTSQL_HPP