"""Run: python goal_version.py. A local SQLite state-transition example.

Demonstrates stale-verdict rejection; not a full agent scheduler.
"""
import sqlite3
import tempfile
from pathlib import Path
import unittest


# BEGIN version
def complete_if_current(db, goal_id, version, attempt):
    with db:
        changed = db.execute(
            """UPDATE goal SET status = 'completed'
               WHERE id = ? AND version = ? AND attempt = ?
                 AND status = 'verifying'""",
            (goal_id, version, attempt),
        ).rowcount
    return changed == 1


def pause(db, goal_id):
    with db:
        db.execute(
            """UPDATE goal SET status = 'paused', attempt = attempt + 1
               WHERE id = ? AND status IN ('active', 'verifying')""",
            (goal_id,),
        )
# END version


class VersionTests(unittest.TestCase):
    def setUp(self):
        self.directory = tempfile.TemporaryDirectory()
        self.addCleanup(self.directory.cleanup)
        self.path = Path(self.directory.name) / "goal.db"
        self.db = self.connect()
        self.db.execute("CREATE TABLE goal(id TEXT PRIMARY KEY, version INTEGER, attempt INTEGER, status TEXT)")
        with self.db:
            self.db.execute("INSERT INTO goal VALUES ('g1', 1, 7, 'verifying')")

    def connect(self):
        db = sqlite3.connect(self.path)
        self.addCleanup(db.close)
        return db

    def test_current_verdict_completes_once(self):
        self.assertTrue(complete_if_current(self.db, "g1", 1, 7))
        self.assertFalse(complete_if_current(self.db, "g1", 1, 7))

    def test_pause_survives_connection_reopen_and_rejects_old_verdict(self):
        pause(self.db, "g1")
        self.db.close()
        reopened = self.connect()
        self.assertFalse(complete_if_current(reopened, "g1", 1, 7))
        self.assertEqual(reopened.execute("SELECT status FROM goal").fetchone()[0], "paused")

    def test_old_attempt_cannot_complete_new_verification(self):
        pause(self.db, "g1")
        with self.db:
            self.db.execute("UPDATE goal SET status='verifying', attempt=attempt+1 WHERE id='g1'")
        self.assertFalse(complete_if_current(self.db, "g1", 1, 7))
        self.assertTrue(complete_if_current(self.db, "g1", 1, 9))

    def test_old_goal_version_cannot_complete_changed_goal(self):
        with self.db:
            self.db.execute("UPDATE goal SET version=2 WHERE id='g1'")
        self.assertFalse(complete_if_current(self.db, "g1", 1, 7))

    def test_cancelled_goal_stays_cancelled(self):
        with self.db:
            self.db.execute("UPDATE goal SET status='cancelled' WHERE id='g1'")
        self.assertFalse(complete_if_current(self.db, "g1", 1, 7))


if __name__ == "__main__":
    unittest.main(verbosity=2)
