# -*- coding: utf-8 -*-

from functools import wraps
from typing import Dict, Optional

from fastapi import HTTPException
from httpx import AsyncClient, URL
from loguru import logger


def api_exception(func):
    @wraps(func)
    async def wrapper(*args, **kwargs):
        try:
            r = await func(*args, **kwargs)
        except Exception:
            raise HTTPException(
                status_code=500,
                detail='The server did not receive a correct response from the upstream server.'
            )
        else:
            return r

    return wrapper


class Service:

    def __init__(self, client: AsyncClient) -> None:
        self._client = client

    @api_exception
    async def _get(self, url: URL, params: Optional[Dict] = None) -> Dict:
        raw_response = await self._client.get(url, params=params)
        logger.debug(f'{url} - elapsed: {raw_response.elapsed.total_seconds()}')

        return raw_response.json()

    @api_exception
    async def _post(self, url: URL, params: Optional[Dict] = None, payload: Optional[Dict] = None) -> Dict:
        raw_response = await self._client.post(url, params=params, json=payload)
        logger.debug(f'{url} - elapsed: {raw_response.elapsed.total_seconds()}')

        return raw_response.json()