pub mod commands;
pub mod dcl;
pub mod ddl;
pub mod dml;
pub mod other;
pub mod tcl;
pub mod types;

use crate::ast::{
    ddl::{
        alter_database::AlterDatabaseQuery, alter_table::AlterTableQuery,
        create_database::CreateDatabaseQuery, create_index::CreateIndexQuery,
        create_table::CreateTableQuery, drop_database::DropDatabaseQuery,
        drop_table::DropTableQuery,
    },
    dml::{delete::DeleteQuery, insert::InsertQuery, select::SelectQuery, update::UpdateQuery},
    other::{
        desc_table::DescTableQuery, show_databases::ShowDatabasesQuery,
        show_tables::ShowTablesQuery, use_database::UseDatabaseQuery,
    },
};

use self::tcl::{BeginTransactionQuery, CommitQuery, RollbackQuery};

#[derive(Clone, Debug, PartialEq, Default)]
pub enum SQLStatement {
    DDL(DDLStatement),
    DML(DMLStatement),
    DCL(DCLStatement),
    TCL(TCLStatement),
    Other(OtherStatement),
    #[default]
    None,
}

#[derive(Clone, Debug, PartialEq)]
pub enum DDLStatement {
    CreateDatabaseQuery(CreateDatabaseQuery),
    AlterDatabase(AlterDatabaseQuery),
    DropDatabaseQuery(DropDatabaseQuery),
    CreateTableQuery(CreateTableQuery),
    AlterTableQuery(AlterTableQuery),
    DropTableQuery(DropTableQuery),
    CreateIndexQuery(CreateIndexQuery),
}

#[derive(Clone, Debug, PartialEq)]
pub enum DMLStatement {
    InsertQuery(InsertQuery),
    UpdateQuery(UpdateQuery),
    DeleteQuery(DeleteQuery),
    SelectQuery(SelectQuery),
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum DCLStatement {}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum OtherStatement {
    ShowDatabases(ShowDatabasesQuery),
    UseDatabase(UseDatabaseQuery),
    ShowTables(ShowTablesQuery),
    DescTable(DescTableQuery),
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum TCLStatement {
    BeginTransaction(BeginTransactionQuery),
    Commit(CommitQuery),
    Rollback(RollbackQuery),
}