use ignis_db::introspection::DatabaseIntrospector;
use ignis_db::migrate::SchemaMigrationManager;
use std::collections::HashMap;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("๐งช Testing Schema Diff with New Object Types");
    
        let pool = sqlx::PgPool::connect("postgresql://postgres:postgres@localhost:5433/postgres").await?;
    let introspector = DatabaseIntrospector::new(pool.clone());
    
        println!("๐ Introspecting current database state...");
    let current_tables = introspector.introspect_tables().await?;
    let current_views = introspector.introspect_views().await?;
    let current_composite_types = introspector.introspect_composite_types().await?;
    let current_indexes = introspector.introspect_indexes().await?;
    let current_functions = introspector.introspect_functions().await?;
    let current_procedures = introspector.introspect_procedures().await?;
    let current_triggers = introspector.introspect_triggers().await?;
    
    println!("๐ Current state:");
    println!("  โข Tables: {}", current_tables.len());
    println!("  โข Views: {}", current_views.len());
    println!("  โข Composite Types: {}", current_composite_types.len());
    println!("  โข Indexes: {}", current_indexes.len());
    println!("  โข Functions: {}", current_functions.len());
    println!("  โข Procedures: {}", current_procedures.len());
    println!("  โข Triggers: {}", current_triggers.len());
    
        println!("\n๐ Testing schema diff with identical states...");
    let manager = SchemaMigrationManager::new(pool)
        .set_old_tables(current_tables.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_new_tables(current_tables.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_old_views(current_views.clone().into_iter().map(|v| (v.name.clone(), v)).collect())
        .set_new_views(current_views.clone().into_iter().map(|v| (v.name.clone(), v)).collect())
        .set_old_composite_types(current_composite_types.clone().into_iter().map(|ct| (ct.name.clone(), ct)).collect())
        .set_new_composite_types(current_composite_types.clone().into_iter().map(|ct| (ct.name.clone(), ct)).collect())
        .set_old_indexes(current_indexes.clone().into_iter().map(|i| (i.name.clone(), i)).collect())
        .set_new_indexes(current_indexes.clone().into_iter().map(|i| (i.name.clone(), i)).collect())
        .set_old_functions(current_functions.clone().into_iter().map(|f| (f.name.clone(), f)).collect())
        .set_new_functions(current_functions.clone().into_iter().map(|f| (f.name.clone(), f)).collect())
        .set_old_procedures(current_procedures.clone().into_iter().map(|p| (p.name.clone(), p)).collect())
        .set_new_procedures(current_procedures.clone().into_iter().map(|p| (p.name.clone(), p)).collect())
        .set_old_triggers(current_triggers.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_new_triggers(current_triggers.clone().into_iter().map(|t| (t.name.clone(), t)).collect());
    
        match manager.generate_migration("test_no_changes") {
        Ok(_) => println!("โ Expected error for no changes, but got success"),
        Err(e) => {
            if e.to_string().contains("No schema changes detected") {
                println!("โ
 Correctly detected no schema changes");
            } else {
                println!("โ Unexpected error: {}", e);
            }
        }
    }
    
    println!("\n๐ Schema diff test completed!");
    Ok(())
}