#![allow(dead_code)]
#![forbid(unsafe_code)]
#![deny(missing_docs)]
#![doc = include_str!("../README.md")]
#![doc(
    html_logo_url = "https://raw.githubusercontent.com/42ByteLabs/geekorm/main/assets/geekorm.png"
)]
pub mod backends;
pub mod builder;
pub mod error;
pub mod queries;
pub mod utils;
#[cfg(feature = "libsql")]
pub use backends::libsql;
pub use crate::backends::{GeekConnection, GeekConnector};
pub use crate::error::Error;
pub use crate::builder::columns::{Column, Columns};
pub use crate::builder::columntypes::{ColumnType, ColumnTypeOptions};
pub use crate::builder::keys::{ForeignKey, PrimaryKey};
pub use crate::builder::table::Table;
pub use crate::builder::values::{Value, Values};
pub use crate::queries::{Query, QueryBuilder};
pub trait TableBuilder
where
    Self: Sized,
{
    fn table() -> Table;
    fn get_table(&self) -> Table;
    fn table_name() -> String;
}
pub trait QueryBuilderTrait
where
    Self: TableBuilder + Sized,
{
    fn query_create() -> QueryBuilder;
    fn query_select() -> QueryBuilder {
        QueryBuilder::select()
    }
    fn query_all() -> Query {
        Self::query_select()
            .table(Self::table())
            .build()
            .expect("Failed to build SELECT ALL query")
    }
    fn query_insert(item: &Self) -> Query;
    fn query_update(item: &Self) -> Query;
    fn query_delete(item: &Self) -> Query;
    fn query_count() -> QueryBuilder;
}
pub trait TablePrimaryKey
where
    Self: TableBuilder + QueryBuilderTrait + Sized,
{
    fn primary_key() -> String;
    fn primary_key_value(&self) -> Value;
    fn query_select_by_primary_key(pk: impl Into<Value>) -> Query {
        Self::query_select()
            .table(Self::table())
            .where_eq(&Self::primary_key(), pk)
            .build()
            .expect("Failed to build SELECT BY PRIMARY KEY query")
    }
}
pub trait ToSqlite {
    fn to_sqlite(&self) -> String {
        String::new()
    }
    #[allow(unused_variables)]
    fn on_create(&self, query: &QueryBuilder) -> Result<String, Error> {
        Ok(String::new())
    }
    fn on_select(&self, query: &QueryBuilder) -> Result<String, Error> {
        Err(Error::QueryBuilderError(
            format!("on_select not implemented for table: {}", query.table),
            String::from("on_select"),
        ))
    }
    fn on_insert(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
        Err(Error::QueryBuilderError(
            format!("on_insert not implemented for table: {}", query.table),
            String::from("on_insert"),
        ))
    }
    fn on_update(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
        Err(Error::QueryBuilderError(
            format!("on_update not implemented for table: {}", query.table),
            String::from("on_update"),
        ))
    }
    fn on_delete(&self, query: &QueryBuilder) -> Result<(String, Values), Error> {
        Err(Error::QueryBuilderError(
            format!("on_delete not implemented for table: {}", query.table),
            String::from("on_delete"),
        ))
    }
}