"""Polygon.io model"""
__docformat__ = "numpy"

from datetime import datetime
from typing import Optional
import requests
import pandas as pd
from openbb_terminal.config_terminal import API_POLYGON_KEY as api_key
from openbb_terminal.helper_funcs import get_user_agent
from openbb_terminal.decorators import check_api_key
from openbb_terminal.rich_config import console

# pylint: disable=unsupported-assignment-operation


@check_api_key(["API_POLYGON_KEY"])
def get_historical(
    fx_pair: str,
    multiplier: int = 1,
    timespan: str = "day",
    start_date: str = "2000-01-01",
    end_date: Optional[str] = None,
) -> pd.DataFrame:
    """Load historical fx data from polygon

    Parameters
    ----------
    fx_pair: str
        Forex pair to download
    multiplier: int
        Multiplier for timespan.  5 with minute timespan indicated 5min windows
    timespan: str
        Window to aggregate data.
    start_date : str
        Initial date, format YYYY-MM-DD
    end_date : Optional[str]
        Final date, format YYYY-MM-DD

    Returns
    -------
    pd.DataFrame
        Dataframe of historical forex prices
    """

    if end_date is None:
        end_date = datetime.now().date().strftime("%Y-%m-%d")

    request_url = (
        f"https://api.polygon.io/v2/aggs/ticker/C:{fx_pair}/range"
        f"/{multiplier}/{timespan}/{start_date}/{end_date}?adjusted=true&sort=desc&limit=50000&apiKey={api_key}"
    )
    json_response = requests.get(
        request_url, headers={"User-Agent": get_user_agent()}
    ).json()

    if json_response["status"] == "ERROR":
        console.print(f"[red]{json_response['error']}[/red]\n")
        return pd.DataFrame()

    if "results" not in json_response.keys():
        console.print("[red]Error in polygon request[/red]\n")
        return pd.DataFrame()

    historical = pd.DataFrame(json_response["results"]).rename(
        columns={
            "o": "Open",
            "c": "Close",
            "h": "High",
            "l": "Low",
            "t": "date",
            "v": "Volume",
            "n": "Transactions",
        }
    )
    historical["date"] = pd.to_datetime(historical.date, unit="ms")
    historical = historical.sort_values(by="date", ascending=True)
    historical = historical.set_index("date")
    return historical
