"""Shared pytest fixtures and deterministic test environment.

Pins env vars to test values *before* any project module is imported, so unit
tests never depend on the developer machine or reach real services.
"""

import os

# Deterministic environment — set before importing project modules.
os.environ.setdefault("CQA_TEST_APP_ENV", "prod")
os.environ.setdefault("PROD_S3_ACCESS_KEY", "test-access-key")
os.environ.setdefault("PROD_S3_SECRET_KEY", "test-secret-key")
os.environ.setdefault("DEV_S3_ACCESS_KEY", "test-dev-access-key")
os.environ.setdefault("DEV_S3_SECRET_KEY", "test-dev-secret-key")
os.environ.setdefault("FLAVA_LOGSTORE_TOKEN", "")

import pytest


class FakeRequest:
    """Minimal stand-in for a Flask request used by APIFunctions helpers."""

    def __init__(
        self,
        method="GET",
        path="/test",
        host="localhost",
        headers=None,
        remote_addr="127.0.0.1",
        json_body=None,
        args=None,
    ):
        self.method = method
        self.path = path
        self.host = host
        self.headers = _Headers(headers or {})
        self.remote_addr = remote_addr
        self._json = json_body
        self.args = args or {}

    def get_json(self, silent=False):
        return self._json


class _Headers:
    def __init__(self, data):
        self._data = dict(data)

    def get(self, key, default=None):
        return self._data.get(key, default)

    def keys(self):
        return self._data.keys()

    def __getitem__(self, key):
        return self._data[key]


@pytest.fixture
def fake_request():
    return FakeRequest


@pytest.fixture
def fake_context():
    """A stand-in for the FaaS context object."""
    from unittest.mock import MagicMock

    ctx = MagicMock()
    ctx.get_project.return_value = "my-project"
    ctx.get_product_domain.return_value = "domain"
    ctx.get_accesstoken.return_value = "tok"
    ctx.get_secret.return_value = "secret-value"
    return ctx
