#!/usr/bin/env python3
"""Reset database to a fresh state by dropping all tables and recreating them."""

import asyncio
import sys
from pathlib import Path

# Add project root to path
project_root = Path(__file__).parent.parent
if str(project_root) not in sys.path:
    sys.path.insert(0, str(project_root))

from sqlalchemy import text
from src.core.database import Base, Database
from src.core.config import get_config


async def reset_database():
    """Reset database by dropping all tables and recreating them."""
    config = get_config()
    db_type = config.get("database.type", "postgresql")
    
    print(f"Resetting {db_type} database...")
    
    # Create database instance to get engine
    db = Database()
    
    try:
        # Drop all tables
        # For PostgreSQL, we need to handle foreign key constraints
        print("Dropping all tables...")
        async with db.engine.begin() as conn:
            # Disable multiple statements in one call caution, but reset logic usually needs strict control.
            # However, asyncpg doesn't support "SET session_replication_role" easily within a transaction block 
            # if it's not a superuser or specific config.
            # Instead, we will use CASCADE drop which is cleaner for full reset.
            
            # Use reflection to find tables is harder in async. 
            # We will just drop all tables using CASCADE via raw SQL or metadata.
            
            # Since we are using async engine, we need to utilize run_sync for metadata operations
            # But drop_all doesn't support CASCADE automatically for all dialects in the way we might want 
            # if using pure SQLAlchemy metadata.drop_all.
            
            # Let's try the standard metadata.drop_all first
            await conn.run_sync(Base.metadata.drop_all)
            
        print("Dropped all tables.")
        
        # Recreate all tables
        print("Recreating all tables...")
        await db.create_tables()
        print("Database reset complete!")
        
    except Exception as e:
        print(f"Error during reset: {e}")
        raise
    finally:
        # Close database connection
        await db.close()


if __name__ == "__main__":
    try:
        asyncio.run(reset_database())
    except Exception as e:
        print(f"Error resetting database: {e}", file=sys.stderr)
        sys.exit(1)
