from datetime import datetime, timezone
from tempfile import TemporaryDirectory
import unittest

from booking_core import BookingStore, display_time, parse_local_datetime


class BookingCoreTests(unittest.TestCase):
    def test_timezone_round_trip(self):
        value = parse_local_datetime("2026-08-20 10:30", "America/New_York")
        self.assertEqual(value.isoformat(), "2026-08-20T14:30:00+00:00")
        self.assertIn("10:30", display_time(value.isoformat().replace("+00:00", "Z"), "America/New_York"))

    def test_capacity_and_rebooking(self):
        with TemporaryDirectory() as directory:
            store = BookingStore(f"{directory}/bookings.sqlite3")
            slot = store.add_slot(datetime(2026, 8, 20, 14, 30, tzinfo=timezone.utc), capacity=1)
            now = datetime(2026, 8, 19, tzinfo=timezone.utc)
            self.assertEqual(store.book(slot, 7, "Ada", now), (True, "booked"))
            self.assertEqual(store.book(slot, 8, "Grace", now), (False, "sold_out"))
            self.assertEqual(store.book(slot, 7, "Ada", now), (False, "already_booked"))
            self.assertTrue(store.cancel(slot, 7))
            self.assertEqual(store.book(slot, 8, "Grace", now), (True, "booked"))
            store.close()

    def test_reminder_claim_is_idempotent(self):
        with TemporaryDirectory() as directory:
            store = BookingStore(f"{directory}/bookings.sqlite3")
            now = datetime(2026, 8, 19, 12, tzinfo=timezone.utc)
            slot = store.add_slot(datetime(2026, 8, 19, 12, 20, tzinfo=timezone.utc))
            self.assertEqual(store.book(slot, 7, "Ada", now), (True, "booked"))
            self.assertEqual(len(store.claim_reminders(now)), 1)
            self.assertEqual(store.claim_reminders(now), [])
            store.close()


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