"""default the embedder to SigLIP 2 — for FRESH installs only (#1203)

Make SigLIP 2 (so400m, 512px; a 1152-d drop-in) the default embedder. New
installs start on it. An EXISTING library is NOT touched: flipping its stored
embedder version would mark every embedding stale (the scorer is version-gated)
and kill suggestions until a full re-embed+retrain — so an existing instance
switches deliberately via Settings → GPU agent → Embedding model → Re-embed →
Retrain. We detect "fresh" by the absence of any embedded image.

Revision ID: 0069
Revises: 0068
Create Date: 2026-06-30
"""
from typing import Sequence, Union

from alembic import op

revision: str = "0069"
down_revision: Union[str, None] = "0068"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

_NEW_NAME = "google/siglip2-so400m-patch16-512"
_NEW_VERSION = "siglip2-so400m-patch16-512"
_OLD_NAME = "google/siglip-so400m-patch14-384"
_OLD_VERSION = "siglip-so400m-patch14-384"


def upgrade() -> None:
    # Fresh install (nothing embedded yet) → adopt SigLIP 2.
    op.execute(
        f"""
        UPDATE ml_settings SET
            embedder_model_name = '{_NEW_NAME}',
            embedder_model_version = '{_NEW_VERSION}'
        WHERE NOT EXISTS (
            SELECT 1 FROM image_record WHERE siglip_embedding IS NOT NULL
        )
        """
    )
    op.alter_column("ml_settings", "embedder_model_name", server_default=_NEW_NAME)
    op.alter_column(
        "ml_settings", "embedder_model_version", server_default=_NEW_VERSION
    )


def downgrade() -> None:
    op.alter_column("ml_settings", "embedder_model_name", server_default=_OLD_NAME)
    op.alter_column(
        "ml_settings", "embedder_model_version", server_default=_OLD_VERSION
    )
