use std::collections::HashMap;

use serde::{Deserialize, Serialize};

use crate::ast::{
    ddl::create_table::CreateTableQuery,
    types::{Column, ForeignKey, TableName, UniqueKey},
};

#[derive(Deserialize, Serialize, Debug, Clone)]
pub struct TableConfig {
    pub table: TableName,
    pub columns: Vec<Column>,
    pub primary_key: Vec<String>,
    pub foreign_keys: Vec<ForeignKey>,
    pub unique_keys: Vec<UniqueKey>,
}

impl TableConfig {
    pub fn get_columns_map(&self) -> HashMap<String, Column> {
        HashMap::from_iter(self.columns.iter().cloned().map(|e| (e.name.clone(), e)))
    }

    pub fn get_required_columns(&self) -> Vec<Column> {
        self.columns
            .iter()
            .filter(|e| e.not_null && e.default.is_none())
            .cloned()
            .collect()
    }
}

impl From<CreateTableQuery> for TableConfig {
    fn from(query: CreateTableQuery) -> Self {
        Self {
            table: query.table.unwrap(),
            columns: query.columns,
            primary_key: query.primary_key,
            foreign_keys: query.foreign_keys,
            unique_keys: query.unique_keys,
        }
    }
}