"""Tests for durable master taxonomy job queue."""

import pytest
from sqlalchemy import create_engine, event
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.orm import Session, sessionmaker

from db.base import Base
from db.master_taxonomy_jobs import (
    claim_next_master_taxonomy_job,
    enqueue_master_taxonomy_job,
    mark_master_taxonomy_job_completed,
)
from db.models import MasterTaxonomyJob


@compiles(JSONB, "sqlite")
def _compile_jsonb_sqlite(element, compiler, **kw):
    return "JSON"


@pytest.fixture()
def taxonomy_job_session() -> Session:
    engine = create_engine("sqlite:///:memory:")
    Base.metadata.create_all(engine, tables=[MasterTaxonomyJob.__table__])
    session = sessionmaker(bind=engine, expire_on_commit=False)()
    try:
        yield session
    finally:
        session.close()
        engine.dispose()


def test_enqueue_claim_and_complete_master_taxonomy_job(taxonomy_job_session):
    row = enqueue_master_taxonomy_job(
        taxonomy_job_session,
        "fix_all",
        {"dry_run": True, "include_magento": True},
    )
    taxonomy_job_session.commit()
    assert row.status == "queued"
    assert row.job_type == "fix_all"

    claimed = claim_next_master_taxonomy_job(taxonomy_job_session, worker_id="test-worker")
    taxonomy_job_session.commit()
    assert claimed is not None
    assert claimed.id == row.id
    assert claimed.status == "running"
    assert claimed.locked_by == "test-worker"

    mark_master_taxonomy_job_completed(taxonomy_job_session, claimed.id, result={"status": "ok"})
    taxonomy_job_session.commit()
    taxonomy_job_session.refresh(claimed)
    assert claimed.status == "completed"

    second = claim_next_master_taxonomy_job(taxonomy_job_session, worker_id="test-worker")
    assert second is None
