"""Add tts_failed and render_failed statuses to jobs collection validator.

These statuses were defined in the Python model but missing from the MongoDB
schema validation, causing WriteError when setting job status to failed states.
"""

from app.migrations.migrator import Migration


class Migration(Migration):
    """Update MongoDB schema validator to support tts_failed and render_failed statuses."""

    def __init__(self):
        super().__init__()
        self.version = "2026-01-05-000000"
        self.description = "Add tts_failed and render_failed statuses to jobs collection"

    async def up(self) -> None:
        """Update the jobs collection validator to include failed statuses."""

        # Define updated schema validator with failed statuses
        validator = {
            "$jsonSchema": {
                "bsonType": "object",
                "required": ["_id", "title", "status", "client_id", "created_at", "updated_at"],
                "properties": {
                    "_id": {"bsonType": "string"},
                    "title": {"bsonType": "string"},
                    "status": {
                        "enum": [
                            "created",
                            "ingesting",
                            "ai_processing",
                            "pending_qc",
                            "approved_english",
                            "approved_source",
                            "rejected",
                            "qc_feedback",
                            "translating",
                            "tts_generating",
                            "tts_failed",        # NEW: TTS synthesis failed after retries
                            "rendering_video",
                            "render_failed",     # NEW: Accessible video rendering failed
                            "pending_final_review",
                            "completed"
                        ]
                    },
                    "client_id": {"bsonType": "string"},
                    "created_at": {"bsonType": "date"},
                    "updated_at": {"bsonType": "date"}
                }
            }
        }

        # Update the collection validator
        try:
            await self.db.command({
                "collMod": "jobs",
                "validator": validator,
                "validationLevel": "moderate",
                "validationAction": "error"
            })
            print("  Updated jobs collection validator")
        except Exception as e:
            print(f"  Could not update validator: {e}")
            raise

        print(f"  Applied migration {self.version}: {self.description}")

    async def down(self) -> None:
        """Revert to previous validator (without failed statuses)."""

        # Define old schema validator
        validator = {
            "$jsonSchema": {
                "bsonType": "object",
                "required": ["_id", "title", "status", "client_id", "created_at", "updated_at"],
                "properties": {
                    "_id": {"bsonType": "string"},
                    "title": {"bsonType": "string"},
                    "status": {
                        "enum": [
                            "created",
                            "ingesting",
                            "ai_processing",
                            "pending_qc",
                            "approved_english",
                            "approved_source",
                            "rejected",
                            "qc_feedback",
                            "translating",
                            "tts_generating",
                            "rendering_video",
                            "pending_final_review",
                            "completed"
                        ]
                    },
                    "client_id": {"bsonType": "string"},
                    "created_at": {"bsonType": "date"},
                    "updated_at": {"bsonType": "date"}
                }
            }
        }

        # Update the collection validator
        await self.db.command({
            "collMod": "jobs",
            "validator": validator,
            "validationLevel": "moderate",
            "validationAction": "error"
        })

        print(f"  Rolled back migration {self.version}: {self.description}")
        print("  WARNING: Jobs with tts_failed or render_failed status will fail validation!")
