import unittest
from unittest.mock import patch

from app.services.integrations import (GetnetAdapter, KlapAdapter,
                                       PAYMENT_HTTP_USER_AGENT,
                                       klap_webhook_apikey)


class FakeResponse:
    status_code = 201
    headers = {"content-type": "application/json"}
    text = ""

    def __init__(self, payload):
        self.payload = payload

    def json(self):
        return self.payload


class PaymentProviderContractTests(unittest.TestCase):
    def test_klap_webhook_apikey_is_sha256_of_api_key_only(self):
        self.assertEqual(
            klap_webhook_apikey("api-key"),
            "8c284055dbb54b7f053a2dc612c3727c7aa36354361055f2110f4903ea8ee29c",
        )

    @patch("app.services.integrations.httpx.post")
    def test_getnet_sends_explicit_http_user_agent(self, post):
        post.return_value = FakeResponse({"status": {"status": "OK"},
                                          "requestId": 123, "processUrl": "https://example.test/pay"})
        adapter = GetnetAdapter("login", "secret-key", "https://checkout.test.getnet.cl", "INTEGRACION")
        adapter.create("REF1", 1000, "https://example.test/return", "https://example.test/cancel",
                       "127.0.0.1", "Browser")
        self.assertEqual(post.call_args.kwargs["headers"]["User-Agent"], PAYMENT_HTTP_USER_AGENT)
        self.assertIn("auth", post.call_args.kwargs["json"])

    @patch("app.services.integrations.httpx.post")
    def test_klap_amount_is_an_object(self, post):
        post.return_value = FakeResponse({"order_id": "ORDER-123",
                                          "redirect_url": "https://pagos-pasarela-sandbox.mcdesaqa.cl/order/ORDER-123"})
        adapter = KlapAdapter("api-key", None, "INTEGRACION")
        adapter.create("REF1", 1000, "https://example.test/return", "https://example.test/webhook")
        self.assertEqual(post.call_args.kwargs["json"]["amount"],
                         {"currency": "CLP", "total": 1000})
        self.assertEqual(post.call_args.kwargs["json"]["methods"], ["tarjetas"])
        self.assertEqual(post.call_args.kwargs["json"]["urls"], {
            "return_url": "https://example.test/return",
            "cancel_url": "https://example.test/return",
        })
        self.assertEqual(post.call_args.kwargs["json"]["webhooks"], {
            "webhook_confirm": "https://example.test/webhook",
            "webhook_reject": "https://example.test/webhook",
        })
        self.assertEqual(post.call_args.kwargs["headers"]["Apikey"], "api-key")


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