"""Earned resets honor finished limits and ignore unrelated rolling windows."""
import time
import unittest

import test_codex_reset as fixtures


class ResetWindowsTest(fixtures.CodexPoolSandbox, unittest.TestCase):
    run_limits = fixtures.CodexResetIntegrationTest.run_limits

    def test_finished_limit_redeems_even_below_numeric_reset_threshold(self):
        now = int(time.time())
        self.server.state["usage"] = {"rate_limit": {"allowed": False, "limit_reached": True,
            "primary_window": {"used_percent": 94, "limit_window_seconds": 604800, "reset_at": now + 86400}},
            "rate_limit_reset_credits": {"available_count": 1}}
        self.server.state["credits"] = {"available_count": 1, "credits": []}
        self.server.state["responses"] = [(200, {"code": "reset", "windows_reset": 1})]
        result = self.run_limits()
        self.assertEqual(result.returncode, 0, result.stderr)
        self.assertEqual(len(self.server.state["posts"]), 1)

    def test_unused_model_windows_do_not_change_the_fleet_redemption_key(self):
        now = int(time.time())
        self.server.state["usage"] = {"rate_limit": {"allowed": True,
            "primary_window": {"used_percent": 95, "limit_window_seconds": 604800, "reset_at": now + 86400}},
            "additional_rate_limits": [{"limit_name": "Unused model", "rate_limit": {
                "primary_window": {"used_percent": 0, "limit_window_seconds": 18000, "reset_at": now + 18000}}}],
            "rate_limit_reset_credits": {"available_count": 2}}
        self.server.state["credits"] = {"available_count": 2, "credits": []}
        self.server.state["responses"] = [(200, {"code": "reset", "windows_reset": 1}),
                                         (200, {"code": "already_redeemed", "windows_reset": 1})]
        self.assertEqual(self.run_limits().returncode, 0)
        # A fleet peer has no local receipt and sees a shifted idle-model window.
        (self.pool / "acct-01/.usage-reset.json").unlink()
        self.server.state["usage"]["additional_rate_limits"][0]["rate_limit"]["primary_window"]["reset_at"] += 30
        self.assertEqual(self.run_limits().returncode, 0)
        posts = self.server.state["posts"]
        self.assertEqual(len(posts), 2)
        self.assertEqual(posts[0]["redeem_request_id"], posts[1]["redeem_request_id"])


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