#!/usr/bin/env python
"""
BaoLife Game Assets Image Generation Script

Generates images for all game assets:
- Elementary schools (6)
- High schools (6)
- Colleges (10)
- Shop items (50+)

Updates education_manager.py and shop_manager.py with new URLs.

Usage:
    python generate_game_assets.py --preview        # Preview what will be generated
    python generate_game_assets.py --generate       # Generate all images
    python generate_game_assets.py --update-code    # Update Python files with new URLs
    python generate_game_assets.py --all            # Generate + update code
"""

import asyncio
import argparse
import logging
import re
from typing import Dict, List
from pathlib import Path
from image_generation import ImageGenerator, save_generated_image
from database.db_operations import get_database_connection

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


# ============================================================
# School Asset Definitions
# ============================================================

ELEMENTARY_SCHOOLS = [
    {
        "name": "Maple Elementary School",
        "type": "public elementary school",
        "prompt": "public elementary school building exterior with playground and students",
        "event_type": "maple_elementary",
    },
    {
        "name": "Eagle Private Academy",
        "type": "private elementary school",
        "prompt": "prestigious private elementary school building exterior with manicured grounds",
        "event_type": "eagle_academy",
    },
    {
        "name": "Greenwood Elementary",
        "type": "public elementary school",
        "prompt": "public elementary school building exterior with trees and playground equipment",
        "event_type": "greenwood_elementary",
    },
    {
        "name": "Bright Stars School",
        "type": "private elementary school",
        "prompt": "small private elementary school building exterior modern architecture",
        "event_type": "bright_stars_school",
    },
    {
        "name": "Lakeview Elementary",
        "type": "public elementary school",
        "prompt": "public elementary school building exterior near water with lake view",
        "event_type": "lakeview_elementary",
    },
    {
        "name": "Grand Oak Elementary",
        "type": "public elementary school",
        "prompt": "large public elementary school building exterior with oak trees",
        "event_type": "grand_oak_elementary",
    },
]

HIGH_SCHOOLS = [
    {
        "name": "Valley High School",
        "type": "public high school",
        "prompt": "large public high school building exterior contemporary architecture",
        "event_type": "valley_high",
    },
    {
        "name": "Prestige Prep School",
        "type": "private prep school",
        "prompt": "prestigious private prep school building exterior brick traditional architecture",
        "event_type": "prestige_prep",
    },
    {
        "name": "Northview High",
        "type": "public high school",
        "prompt": "modern public high school building exterior with sports fields",
        "event_type": "northview_high",
    },
    {
        "name": "Academic Excellence Institute",
        "type": "private academy",
        "prompt": "elite private academy building exterior classical architecture columns",
        "event_type": "academic_excellence",
    },
    {
        "name": "Harmony High",
        "type": "public high school",
        "prompt": "public high school building exterior modern design with courtyard",
        "event_type": "harmony_high",
    },
    {
        "name": "Mountain Ridge High",
        "type": "public high school",
        "prompt": "public high school building exterior mountain setting scenic backdrop",
        "event_type": "mountain_ridge_high",
    },
]

COLLEGES = [
    {
        "name": "University of Science",
        "specialization": "Science and Engineering",
        "prompt": "university science building exterior modern architecture glass windows",
        "event_type": "university_science",
    },
    {
        "name": "Artistic Minds University",
        "specialization": "Arts and Humanities",
        "prompt": "arts university building exterior creative architecture colorful design",
        "event_type": "artistic_minds_university",
    },
    {
        "name": "Eastern Commerce College",
        "specialization": "Business and Economics",
        "prompt": "business college building exterior contemporary corporate architecture",
        "event_type": "eastern_commerce_college",
    },
    {
        "name": "Law and Governance University",
        "specialization": "Law and Politics",
        "prompt": "law school building exterior classical architecture with columns",
        "event_type": "law_governance_university",
    },
    {
        "name": "Institute of Tech Innovation",
        "specialization": "Technology and Computer Science",
        "prompt": "technology institute building exterior futuristic modern architecture",
        "event_type": "tech_innovation_institute",
    },
    {
        "name": "Liberal Arts Academy",
        "specialization": "Liberal Arts",
        "prompt": "liberal arts college building exterior traditional campus architecture",
        "event_type": "liberal_arts_academy",
    },
    {
        "name": "Northern Agriculture College",
        "specialization": "Agriculture",
        "prompt": "agriculture college building exterior with farmland and greenhouses",
        "event_type": "agriculture_college",
    },
    {
        "name": "Health and Medicine University",
        "specialization": "Health and Medicine",
        "prompt": "medical school building exterior modern hospital-style architecture",
        "event_type": "health_medicine_university",
    },
    {
        "name": "Oceanography Institute",
        "specialization": "Marine Science",
        "prompt": "oceanography institute building exterior near water coastal setting",
        "event_type": "oceanography_institute",
    },
    {
        "name": "Performing Arts School",
        "specialization": "Performing Arts",
        "prompt": "performing arts school building exterior theater architecture elegant design",
        "event_type": "performing_arts_school",
    },
]


# ============================================================
# Shop Items Asset Definitions
# ============================================================

SHOP_ITEMS = [
    {"name": "Case of Energy Drinks", "prompt": "pack of energy drinks product image on white background", "event_type": "energy_drinks"},
    {"name": "Sports Car", "prompt": "luxury sports car product image sleek red sports car", "event_type": "sports_car"},
    {"name": "Luxury Phone", "prompt": "high-end smartphone product image latest technology", "event_type": "luxury_phone"},
    {"name": "Designer Suit", "prompt": "designer suit on mannequin product image elegant tailored", "event_type": "designer_suit"},
    {"name": "Luxury Watch", "prompt": "luxury wristwatch product image expensive timepiece", "event_type": "luxury_watch"},
    {"name": "High-End Laptop", "prompt": "high-end laptop computer product image modern design", "event_type": "laptop"},
    {"name": "Artisan Coffee Machine", "prompt": "artisan espresso coffee machine product image", "event_type": "coffee_machine"},
    {"name": "Luxury Yacht", "prompt": "luxury yacht on water product image white yacht", "event_type": "yacht"},
    {"name": "Private Jet", "prompt": "private jet airplane product image luxury aircraft", "event_type": "private_jet"},
    {"name": "Designer Handbag", "prompt": "designer handbag product image luxury purse", "event_type": "handbag"},
    {"name": "Diamond Ring", "prompt": "diamond engagement ring product image sparkling", "event_type": "diamond_ring"},
    {"name": "Personal Island", "prompt": "tropical private island aerial view paradise", "event_type": "private_island"},
    {"name": "Luxury Villa", "prompt": "luxury villa mansion exterior modern architecture", "event_type": "luxury_villa"},
    {"name": "Exotic Pet", "prompt": "exotic parrot bird product image colorful tropical", "event_type": "exotic_pet"},
    {"name": "Gourmet Chef", "prompt": "professional chef in kitchen cooking gourmet meal", "event_type": "gourmet_chef"},
    {"name": "Famous Painting", "prompt": "framed classical painting on wall art gallery", "event_type": "famous_painting"},
    {"name": "Rare Wine", "prompt": "fine wine bottle product image vintage red wine", "event_type": "rare_wine"},
    {"name": "Limited Edition Sneakers", "prompt": "limited edition sneakers product image stylish athletic shoes", "event_type": "sneakers"},
    {"name": "Luxury Skincare Set", "prompt": "luxury skincare products set on white background", "event_type": "skincare"},
    {"name": "Concert Tickets", "prompt": "concert tickets to live music show event", "event_type": "concert_tickets"},
    {"name": "Custom-Made Dress", "prompt": "custom designer dress on mannequin elegant evening gown", "event_type": "custom_dress"},
    {"name": "High-End Stereo System", "prompt": "high-end stereo speakers audio system product image", "event_type": "stereo"},
    {"name": "Designer Sunglasses", "prompt": "designer sunglasses product image stylish eyewear", "event_type": "sunglasses"},
    {"name": "Five Star Vacation", "prompt": "luxury beach resort five star hotel tropical vacation", "event_type": "vacation"},
    {"name": "Fitness Membership", "prompt": "modern fitness gym interior with equipment", "event_type": "gym_membership"},
    {"name": "Gourmet Kitchen Set", "prompt": "gourmet kitchen appliances set product image", "event_type": "kitchen_set"},
    {"name": "Home Theatre System", "prompt": "home theater room with projector and seating", "event_type": "home_theater"},
    {"name": "Vintage Guitar", "prompt": "vintage acoustic guitar product image classic instrument", "event_type": "guitar"},
    {"name": "Designer Furniture Set", "prompt": "modern designer furniture living room set", "event_type": "furniture"},
    {"name": "Luxury Fragrance", "prompt": "luxury perfume bottle product image elegant fragrance", "event_type": "perfume"},
    {"name": "Antique Chess Set", "prompt": "antique chess set board and pieces product image", "event_type": "chess_set"},
    {"name": "Rare Book Collection", "prompt": "collection of rare antique books on shelf", "event_type": "book_collection"},
    {"name": "Upscale Pet House", "prompt": "luxury dog house product image upscale pet home", "event_type": "pet_house"},
    {"name": "Orchard Garden", "prompt": "fruit orchard garden with apple trees", "event_type": "orchard"},
    {"name": "Private Helicopter", "prompt": "private helicopter product image luxury aircraft", "event_type": "helicopter"},
    {"name": "Gold-Plated Pool Table", "prompt": "gold-plated pool table billiards product image luxury", "event_type": "pool_table"},
    {"name": "Smart Home System", "prompt": "smart home control panel and devices technology", "event_type": "smart_home"},
    {"name": "Rare Comic Collection", "prompt": "collection of rare vintage comic books in sleeves", "event_type": "comics"},
    {"name": "Collector's Edition Board Games", "prompt": "collector edition board games product box set", "event_type": "board_games"},
    {"name": "Home Recording Studio", "prompt": "home music recording studio with equipment", "event_type": "recording_studio"},
    {"name": "Advanced Drone", "prompt": "advanced camera drone product image technology", "event_type": "drone"},
    {"name": "Luxury Hot Tub", "prompt": "luxury hot tub jacuzzi spa product image", "event_type": "hot_tub"},
    {"name": "Designer Watch", "prompt": "designer luxury watch product image timepiece", "event_type": "designer_watch"},
    {"name": "Platinum Credit Card", "prompt": "platinum credit card product image metallic", "event_type": "credit_card"},
    {"name": "Personal Robot", "prompt": "personal assistant robot product image futuristic", "event_type": "robot"},
    {"name": "Crystal Chandelier", "prompt": "crystal chandelier product image elegant lighting", "event_type": "chandelier"},
    {"name": "Italian Leather Sofa", "prompt": "italian leather sofa product image luxury furniture", "event_type": "leather_sofa"},
    {"name": "Skydiving Experience", "prompt": "skydiving person falling through clouds adventure", "event_type": "skydiving"},
    {"name": "Space Travel Ticket", "prompt": "space shuttle rocket launch into space", "event_type": "space_travel"},
    {"name": "Virtual Reality System", "prompt": "virtual reality VR headset and controllers product image", "event_type": "vr_system"},
    {"name": "Diamond Pack", "prompt": "cluster of blue diamonds gemstones product image", "event_type": "diamonds"},
]


# ============================================================
# Generation Functions
# ============================================================

async def generate_school_images(provider: str = 'imagen4'):
    """Generate images for all schools (elementary, high, college)"""
    generator = ImageGenerator(provider=provider)

    total = len(ELEMENTARY_SCHOOLS) + len(HIGH_SCHOOLS) + len(COLLEGES)
    logger.info(f"Generating {total} school images using {provider.upper()}\n")

    count = 0

    # Elementary Schools
    logger.info("=" * 70)
    logger.info(f"ELEMENTARY SCHOOLS ({len(ELEMENTARY_SCHOOLS)} images)")
    logger.info("=" * 70)

    for school in ELEMENTARY_SCHOOLS:
        count += 1
        logger.info(f"\n[{count}/{total}] {school['name']}")
        logger.info(f"Prompt: {school['prompt']}")

        image_url, error = await generator.generate_image(school['prompt'])

        if image_url:
            await save_generated_image(
                image_url=image_url,
                prompt=school['prompt'],
                provider=provider,
                event_type=school['event_type'],
                event_category='education_elementary',
                tags=[school['name'], 'elementary school', school['type']]
            )
            logger.info(f"✓ Generated: {image_url[:60]}...")
        else:
            logger.error(f"✗ Failed: {error}")

        await asyncio.sleep(3)

    # High Schools
    logger.info("\n" + "=" * 70)
    logger.info(f"HIGH SCHOOLS ({len(HIGH_SCHOOLS)} images)")
    logger.info("=" * 70)

    for school in HIGH_SCHOOLS:
        count += 1
        logger.info(f"\n[{count}/{total}] {school['name']}")
        logger.info(f"Prompt: {school['prompt']}")

        image_url, error = await generator.generate_image(school['prompt'])

        if image_url:
            await save_generated_image(
                image_url=image_url,
                prompt=school['prompt'],
                provider=provider,
                event_type=school['event_type'],
                event_category='education_high_school',
                tags=[school['name'], 'high school', school['type']]
            )
            logger.info(f"✓ Generated: {image_url[:60]}...")
        else:
            logger.error(f"✗ Failed: {error}")

        await asyncio.sleep(3)

    # Colleges
    logger.info("\n" + "=" * 70)
    logger.info(f"COLLEGES ({len(COLLEGES)} images)")
    logger.info("=" * 70)

    for college in COLLEGES:
        count += 1
        logger.info(f"\n[{count}/{total}] {college['name']}")
        logger.info(f"Prompt: {college['prompt']}")

        image_url, error = await generator.generate_image(college['prompt'])

        if image_url:
            await save_generated_image(
                image_url=image_url,
                prompt=college['prompt'],
                provider=provider,
                event_type=college['event_type'],
                event_category='education_college',
                tags=[college['name'], 'college', college['specialization']]
            )
            logger.info(f"✓ Generated: {image_url[:60]}...")
        else:
            logger.error(f"✗ Failed: {error}")

        await asyncio.sleep(3)

    logger.info("\n" + "=" * 70)
    logger.info(f"Completed: {count} school images generated")
    logger.info("=" * 70)


async def generate_shop_images(provider: str = 'imagen4'):
    """Generate images for shop items"""
    generator = ImageGenerator(provider=provider)

    total = len(SHOP_ITEMS)
    logger.info(f"Generating {total} shop item images using {provider.upper()}\n")

    logger.info("=" * 70)
    logger.info(f"SHOP ITEMS ({total} images)")
    logger.info("=" * 70)

    for i, item in enumerate(SHOP_ITEMS, 1):
        logger.info(f"\n[{i}/{total}] {item['name']}")
        logger.info(f"Prompt: {item['prompt']}")

        image_url, error = await generator.generate_image(item['prompt'])

        if image_url:
            await save_generated_image(
                image_url=image_url,
                prompt=item['prompt'],
                provider=provider,
                event_type=item['event_type'],
                event_category='shop_item',
                tags=[item['name'], 'product', 'shop']
            )
            logger.info(f"✓ Generated: {image_url[:60]}...")
        else:
            logger.error(f"✗ Failed: {error}")

        await asyncio.sleep(3)

    logger.info("\n" + "=" * 70)
    logger.info(f"Completed: {total} shop item images generated")
    logger.info("=" * 70)


def preview_generation():
    """Preview what will be generated"""
    total = len(ELEMENTARY_SCHOOLS) + len(HIGH_SCHOOLS) + len(COLLEGES) + len(SHOP_ITEMS)

    print(f"\n{'='*70}")
    print(f"PREVIEW: {total} images will be generated")
    print(f"{'='*70}\n")

    print(f"Elementary Schools: {len(ELEMENTARY_SCHOOLS)}")
    for school in ELEMENTARY_SCHOOLS:
        print(f"  • {school['name']}: {school['prompt']}")

    print(f"\nHigh Schools: {len(HIGH_SCHOOLS)}")
    for school in HIGH_SCHOOLS:
        print(f"  • {school['name']}: {school['prompt']}")

    print(f"\nColleges: {len(COLLEGES)}")
    for college in COLLEGES:
        print(f"  • {college['name']}: {college['prompt']}")

    print(f"\nShop Items: {len(SHOP_ITEMS)}")
    for item in SHOP_ITEMS:
        print(f"  • {item['name']}: {item['prompt']}")

    print(f"\n{'='*70}")
    print(f"Total: {total} images")
    print(f"Estimated time: {total * 12 / 60:.1f} minutes (@ ~12 sec/image)")
    print(f"{'='*70}\n")


def update_code_files():
    """Update Python files with new generated image URLs"""
    logger.info("Updating Python files with generated images...")

    # TODO: Implement actual file update logic
    logger.info("⚠️  Code update not yet implemented. Use database queries to get URLs.")
    logger.info("Run these SQL queries to get new URLs:")
    logger.info("")
    logger.info("-- Elementary schools")
    logger.info("SELECT event_type, image_url FROM generated_images WHERE event_category = 'education_elementary';")
    logger.info("")
    logger.info("-- High schools")
    logger.info("SELECT event_type, image_url FROM generated_images WHERE event_category = 'education_high_school';")
    logger.info("")
    logger.info("-- Colleges")
    logger.info("SELECT event_type, image_url FROM generated_images WHERE event_category = 'education_college';")
    logger.info("")
    logger.info("-- Shop items")
    logger.info("SELECT event_type, image_url FROM generated_images WHERE event_category = 'shop_item' ORDER BY event_type;")


# ============================================================
# Main CLI
# ============================================================

async def main():
    parser = argparse.ArgumentParser(
        description="Generate images for BaoLife game assets",
        formatter_class=argparse.RawDescriptionHelpFormatter
    )

    parser.add_argument('--preview', action='store_true', help='Preview what will be generated')
    parser.add_argument('--generate', action='store_true', help='Generate all images')
    parser.add_argument('--schools', action='store_true', help='Generate only school images')
    parser.add_argument('--shop', action='store_true', help='Generate only shop item images')
    parser.add_argument('--update-code', action='store_true', help='Update Python files with new URLs')
    parser.add_argument('--all', action='store_true', help='Generate all images and update code')
    parser.add_argument('--provider', choices=['imagen4', 'flux', 'dalle3'], default='imagen4',
                       help='Image generation provider (default: imagen4)')

    args = parser.parse_args()

    if args.preview:
        preview_generation()
    elif args.all:
        await generate_school_images(provider=args.provider)
        await generate_shop_images(provider=args.provider)
        update_code_files()
    elif args.generate:
        await generate_school_images(provider=args.provider)
        await generate_shop_images(provider=args.provider)
    elif args.schools:
        await generate_school_images(provider=args.provider)
    elif args.shop:
        await generate_shop_images(provider=args.provider)
    elif args.update_code:
        update_code_files()
    else:
        parser.print_help()


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