import os
from celery_app import app
from config import settings
from utils.image_utils import (
    load_equirectangular_image,
    validate_equirectangular,
    generate_thumbnail,
)
from sqlalchemy import create_engine, text
from sqlalchemy.orm import Session


@app.task(bind=True)
def preprocess_images(self, house_id: str):
    """Validate all panoramas, generate thumbnails."""
    engine = create_engine(settings.database_url)
    errors = []
    processed = 0

    try:
        with Session(engine) as session:
            # Get all panoramas for this house
            result = session.execute(
                text(
                    "SELECT id, file_path FROM panoramas WHERE house_id = :house_id"
                ),
                {"house_id": house_id},
            )
            panoramas = result.fetchall()

            for pano_id, file_path in panoramas:
                try:
                    full_path = os.path.join(settings.upload_dir, file_path)
                    if not os.path.exists(full_path):
                        errors.append(
                            f"File not found for pano {pano_id}: {full_path}"
                        )
                        continue

                    # Load and validate equirectangular
                    image = load_equirectangular_image(full_path)
                    is_valid = validate_equirectangular(image)

                    # Generate thumbnail
                    thumb = generate_thumbnail(image)
                    thumb_dir = os.path.join(
                        settings.upload_dir, "thumbnails", house_id
                    )
                    os.makedirs(thumb_dir, exist_ok=True)
                    thumb_path = os.path.join(thumb_dir, f"{pano_id}.jpg")
                    thumb.save(thumb_path, "JPEG", quality=85)

                    # Update database
                    thumb_rel_path = os.path.join(
                        "uploads", "thumbnails", house_id, f"{pano_id}.jpg"
                    )
                    session.execute(
                        text(
                            "UPDATE panoramas SET validated = :validated, "
                            "thumbnail_path = :thumb WHERE id = :id"
                        ),
                        {
                            "validated": is_valid,
                            "thumb": thumb_rel_path,
                            "id": pano_id,
                        },
                    )
                    session.commit()
                    processed += 1

                except Exception as e:
                    errors.append(f"Error processing pano {pano_id}: {str(e)}")
                    session.rollback()

    except Exception as e:
        return {"success": False, "processed": processed, "errors": [str(e)]}

    return {
        "success": len(errors) == 0,
        "processed": processed,
        "errors": errors,
    }
