from datetime import datetime
import sqlite3
import unittest
from zoneinfo import ZoneInfo

from app.services.tenant_store import TenantStore, _timeclock_cutoff_after


class TimeclockAutoCloseTests(unittest.TestCase):
    def test_cutoff_is_same_day_for_shift_started_before_six(self) -> None:
        rome = ZoneInfo("Europe/Rome")
        started_at = datetime(2026, 6, 19, 2, 30, tzinfo=rome)
        self.assertEqual(_timeclock_cutoff_after(started_at), datetime(2026, 6, 19, 6, 0, tzinfo=rome))

    def test_cutoff_is_next_day_for_shift_started_after_six(self) -> None:
        rome = ZoneInfo("Europe/Rome")
        started_at = datetime(2026, 6, 18, 16, 42, tzinfo=rome)
        self.assertEqual(_timeclock_cutoff_after(started_at), datetime(2026, 6, 19, 6, 0, tzinfo=rome))

    def test_stale_shift_is_closed_idempotently(self) -> None:
        connection = sqlite3.connect(":memory:")
        connection.row_factory = sqlite3.Row
        connection.execute(
            """
            CREATE TABLE tenant_timeclock_entries (
                id TEXT PRIMARY KEY,
                user_id TEXT NOT NULL,
                user_name TEXT,
                started_at TEXT NOT NULL,
                ended_at TEXT,
                duration_seconds INTEGER,
                ended_source TEXT,
                notes TEXT,
                updated_at TEXT
            )
            """
        )
        connection.execute(
            """
            INSERT INTO tenant_timeclock_entries (id, user_id, user_name, started_at)
            VALUES ('shift-1', 'user-1', 'Dipendente', '2026-06-18T16:42:00+02:00')
            """
        )
        store = TenantStore.__new__(TenantStore)
        now = datetime(2026, 6, 19, 8, 0, tzinfo=ZoneInfo("Europe/Rome"))

        first = store._auto_close_timeclock_entries_in_connection(connection, now=now)
        second = store._auto_close_timeclock_entries_in_connection(connection, now=now)
        saved = connection.execute(
            "SELECT ended_at, duration_seconds, ended_source, notes FROM tenant_timeclock_entries WHERE id = 'shift-1'"
        ).fetchone()
        connection.close()

        self.assertEqual(len(first), 1)
        self.assertEqual(second, [])
        self.assertEqual(saved["ended_at"], "2026-06-19T06:00:00+02:00")
        self.assertEqual(saved["duration_seconds"], 47880)
        self.assertEqual(saved["ended_source"], "automatic_cutoff_06_00")
        self.assertIn("06:00", saved["notes"])


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