#!/usr/bin/env python3
"""
Database Initialization Script
Creates tables and seeds initial data
"""
import asyncio
import sys
from pathlib import Path

# Add parent directory to path
sys.path.insert(0, str(Path(__file__).parent.parent))

from app.database import engine, Base, AsyncSessionLocal
from app.config import settings
from app.models import User, Client, Subscription
from passlib.context import CryptContext
from datetime import datetime, timedelta

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")


async def create_tables():
    """Create all database tables"""
    print("Creating database tables...")
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)
    print("Tables created successfully!")


async def seed_data():
    """Seed initial data"""
    print("Seeding initial data...")

    async with AsyncSessionLocal() as session:
        # Check if admin already exists
        from sqlalchemy import select
        result = await session.execute(
            select(User).where(User.email == "admin@ai360.com")
        )
        admin = result.scalar_one_or_none()

        if not admin:
            # Create super admin
            admin = User(
                email="admin@ai360.com",
                password_hash=pwd_context.hash("Admin@123"),
                name="Super Admin",
                role="super_admin",
                is_active=True,
                is_verified=True,
                email_verified=True
            )
            session.add(admin)
            print("  - Created admin user (admin@ai360.com / Admin@123)")

        # Check if demo client exists
        result = await session.execute(
            select(Client).where(Client.company_email == "demo@company.com")
        )
        demo_client = result.scalar_one_or_none()

        if not demo_client:
            # Create demo client
            demo_client = Client(
                company_name="Demo Company",
                company_email="demo@company.com",
                industry="Technology",
                status="active",
                is_verified=True
            )
            session.add(demo_client)
            await session.flush()

            # Create demo user
            demo_user = User(
                email="demo@company.com",
                password_hash=pwd_context.hash("Demo@123"),
                name="Demo User",
                role="client_owner",
                client_id=demo_client.id,
                is_active=True,
                is_verified=True,
                email_verified=True
            )
            session.add(demo_user)
            print("  - Created demo client (demo@company.com / Demo@123)")

            # Create demo subscription
            subscription = Subscription(
                client_id=demo_client.id,
                service_type="chatbot",
                plan_tier="professional",
                plan_name="Professional Plan",
                price_monthly=4999.00,
                status="trial",
                trial_end_date=datetime.now().date() + timedelta(days=14),
                usage_limits={"messages": 5000, "api_calls": 10000}
            )
            session.add(subscription)
            print("  - Created demo subscription")

        await session.commit()

    print("Seeding completed!")


async def main():
    """Main initialization function"""
    print(f"\n{'='*50}")
    print("AI360 Platform - Database Initialization")
    print(f"{'='*50}")
    print(f"Database URL: {settings.DATABASE_URL[:50]}...")
    print(f"{'='*50}\n")

    try:
        await create_tables()
        await seed_data()
        print(f"\n{'='*50}")
        print("Database initialization completed successfully!")
        print(f"{'='*50}\n")
    except Exception as e:
        print(f"\nError during initialization: {e}")
        raise


if __name__ == "__main__":
    asyncio.run(main())
