#!/usr/bin/env python3
"""
Add user with known password hash

Usage:
    python add_user_with_hash.py <username> <email> <password_hash> [role]

Example:
    python add_user_with_hash.py testuser test@example.com <hash> admin
"""
import sys
import argparse
from pathlib import Path

# Add project root to path
project_root = Path(__file__).parent
sys.path.insert(0, str(project_root / "backend"))

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from backend.app.models.user import User


def add_user_with_hash(username: str, email: str, password_hash: str, role: str = "user"):
    """Add a user with a known password hash directly to the database"""
    
    # Get database URL from environment
    import os
    from dotenv import load_dotenv
    env_file = project_root / ".env"
    if env_file.exists():
        load_dotenv(env_file)
    
    database_url = os.getenv("DATABASE_URL")
    if not database_url:
        print("ERROR: DATABASE_URL not found in .env file")
        sys.exit(1)
    
    try:
        # Connect to database
        engine = create_engine(database_url)
        Session = sessionmaker(bind=engine)
        session = Session()
        
        # Check if user already exists
        existing_user = session.query(User).filter(
            (User.username == username) | (User.email == email)
        ).first()
        
        if existing_user:
            print(f"ERROR: User '{username}' or email '{email}' already exists")
            session.close()
            sys.exit(1)
        
        # Create new user with provided hash
        new_user = User(
            username=username,
            email=email,
            password_hash=password_hash,
            role=role
        )
        session.add(new_user)
        session.commit()
        session.refresh(new_user)
        
        print(f"SUCCESS: User '{username}' created successfully")
        print(f"  ID: {new_user.id}")
        print(f"  Username: {new_user.username}")
        print(f"  Email: {new_user.email}")
        print(f"  Role: {new_user.role}")
        print(f"  Active: {new_user.is_active}")
        
        session.close()
        
    except Exception as e:
        print(f"ERROR: Failed to create user: {e}")
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(
        description="Add user with known password hash to StreamA2026 database",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
Examples:
    python add_user_with_hash.py testuser test@example.com <hash> admin
    python add_user_with_hash.py myuser my@example.com <hash> user
        """
    )
    parser.add_argument("username", help="Username for the new user")
    parser.add_argument("email", help="Email for the new user")
    parser.add_argument("password_hash", help="Password hash (bcrypt/scrypt format)")
    parser.add_argument("role", nargs="?", default="user", 
                       choices=["user", "mod", "subscriber", "creator", "admin"],
                       help="User role (default: user)")
    
    args = parser.parse_args()
    
    print(f"Adding user '{args.username}' with role '{args.role}'...")
    add_user_with_hash(args.username, args.email, args.password_hash, args.role)


if __name__ == "__main__":
    main()
