from typing import Dict
import aiohttp

from dataclasses import dataclass
from multidict import CIMultiDictProxy

PROXY_HOST = "sebas-test.lunarhq.dev"
BASE64_PATH = "/base64/{value}"
ANYTHING_PATH = "/anything"
PATH_FACT = "/fact"
HTTPBIN_HOST = "httpbin.org"
CATFACT_HOST = "catfact.ninja"

HTTP_PORT = 80
HTTPS_PORT = 443

GET = "GET"
POST = "POST"

HTTP = "http"
HTTPS = "https"


@dataclass
class ResponseData:
    body: str
    headers: CIMultiDictProxy[str]
    status: int


async def make_request(
    method: str,
    url: str,
    host_header: str,
    body: str | None = None,
    headers: Dict[str, str] | None = None,
) -> ResponseData:
    if headers is None:
        headers = {}
    async with aiohttp.ClientSession() as client:
        async with client.request(
            method,
            url,
            headers={"Host": host_header, **headers},
            data=body,
            allow_redirects=False,
        ) as resp:
            response_headers = resp.headers
            response_body = await resp.text()

            return ResponseData(
                body=response_body,
                headers=response_headers,
                status=resp.status,
            )


def build_url(scheme: str, host: str, path: str):
    return f"{scheme}://{host}{path}"
