from .Mappings import perform_info_mapping, perform_news_mapping
from .Exceptions import *
from .Requester import *
from loguru import logger
from . import Converters
import json


def get_squad_news(squad_id) -> dict | None:
    """
    Returns news of squadron with specified id or None if squadron doesn't exists or there is no news

    :param squad_id:
    :return:
    """

    news_request: requests.Response = request(BASE_URL + NEWS_ENDPOINT, params={'squadronId': squad_id})
    if news_request.status_code != 200:  # must not happen
        logger.warning(f'Got not 200 status code on requesting news, content: {news_request.content}, '
                       f'code: {news_request.status_code}')

    squad_news: dict = news_request.json()['squadron']

    if isinstance(squad_news, list):  # check squadron 2517 for example 0_0
        # squadron have no public statements
        return None

    elif 'id' not in squad_news.keys():  # squadron doesn't FDEV
        return None

    else:
        if 'public_statements' in squad_news.keys() and len(squad_news['public_statements']) > 0:
            return perform_news_mapping(squad_news['public_statements'][0])


def get_squad_info(squad_id: int) -> dict | None:
    """Returns information about squadron with specified id or None if squadrons doesn't exists on FDEV side

    :param squad_id: id of squad to update/insert
    :return: dict with state of squadron or None if squad not found
    """

    """
    Request squad's info
    
    if squad exists FDEV
        return squadron state
    
    if squad doesn't exists FDEV        
       return None
    """

    squad_request: requests.Response = request(BASE_URL + INFO_ENDPOINT, params={'squadronId': squad_id})

    if squad_request.status_code == 200:  # squad exists FDEV
        squad_request_json: dict = squad_request.json()['squadron']
        squad_request_json['ownerName'] = Converters.dehexify(squad_request_json['ownerName'])  # normalize value
        squad_request_json['userTags'] = json.dumps(squad_request_json['userTags'])
        squad_request_json = perform_info_mapping(squad_request_json)

        return squad_request_json

    elif squad_request.status_code == 404:  # squad doesn't exists FDEV
        return None

    else:  # any other codes (except 418, that one handles in authed_request), never should happen
        logger.warning(f'Unknown squad info status_code: {squad_request.status_code}, content: {squad_request.content}')
        raise FAPIUnknownStatusCode(f'Status code: {squad_request.status_code}, content: {squad_request.content}')