"""GitHub repo naming + remote metadata, setup stage, codegen worker checkpoint.

Revision ID: 014
Revises: 013
"""
from typing import Sequence, Union

import sqlalchemy as sa
from alembic import op
from sqlalchemy.dialects.postgresql import JSONB, UUID

revision: str = "014"
down_revision: Union[str, None] = "013"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
    op.add_column("projects", sa.Column("github_repo_name", sa.String(length=100), nullable=True))
    op.execute(
        """
        UPDATE projects
        SET github_repo_name = SUBSTRING('p2hs-' || REPLACE(id::text, '-', ''), 1, 100)
        WHERE github_repo_name IS NULL;
        """
    )
    op.create_index(
        "uq_projects_github_repo_name",
        "projects",
        ["github_repo_name"],
        unique=True,
        postgresql_where=sa.text("github_repo_name IS NOT NULL"),
    )

    op.add_column("project_repos", sa.Column("clone_url", sa.Text(), nullable=True))
    op.add_column("project_repos", sa.Column("html_url", sa.Text(), nullable=True))
    op.add_column("project_repos", sa.Column("setup_stage", sa.String(length=50), nullable=True))
    op.add_column("project_repos", sa.Column("initial_commit_sha", sa.String(length=40), nullable=True))
    op.add_column(
        "project_repos",
        sa.Column("setup_preview_id", UUID(as_uuid=True), nullable=True),
    )

    op.add_column("codegen_runs", sa.Column("worker_checkpoint", sa.String(length=64), nullable=True))
    op.add_column("codegen_runs", sa.Column("checkpoint_payload", JSONB(), nullable=True))


def downgrade() -> None:
    op.drop_column("codegen_runs", "checkpoint_payload")
    op.drop_column("codegen_runs", "worker_checkpoint")
    op.drop_column("project_repos", "setup_preview_id")
    op.drop_column("project_repos", "initial_commit_sha")
    op.drop_column("project_repos", "setup_stage")
    op.drop_column("project_repos", "html_url")
    op.drop_column("project_repos", "clone_url")
    op.drop_index("uq_projects_github_repo_name", table_name="projects")
    op.drop_column("projects", "github_repo_name")
