"""Rekt view"""
import logging
import os
from typing import Optional, List

from matplotlib import pyplot as plt
from matplotlib import ticker
from openbb_terminal.alternative.oss import runa_model
from openbb_terminal.decorators import log_start_end
from openbb_terminal.helper_funcs import (
    export_data,
    plot_autoscale,
    lambda_long_number_format,
    print_rich_table,
    is_valid_axes_count,
)
from openbb_terminal.config_terminal import theme
from openbb_terminal.config_plot import PLOT_DPI
from openbb_terminal.rich_config import console

logger = logging.getLogger(__name__)


@log_start_end(log=logger)
def display_rossindex(
    limit: int = 10,
    sortby: str = "Stars AGR [%]",
    ascend: bool = False,
    show_chart: bool = False,
    show_growth: bool = True,
    chart_type: str = "stars",
    export: str = "",
    external_axes: Optional[List[plt.Axes]] = None,
) -> None:
    """Plots list of startups from ross index [Source: https://runacap.com/]

    Parameters
    ----------
    limit: int
        Number of startups to search
    sortby: str
        Key by which to sort data. Default: Stars AGR [%]
    ascend: bool
        Flag to sort data descending
    show_chart: bool
        Flag to show chart with startups
    show_growth: bool
        Flag to show growth line chart
    chart_type: str
        Chart type {stars,forks}
    export : str
        Export dataframe data to csv,json,xlsx file
    external_axes : Optional[List[plt.Axes]], optional
        External axes (1 axis is expected in the list), by default None
    """
    df = runa_model.get_startups()

    if df.empty:
        console.print("\nError in runa request\n")
    else:
        if sortby in runa_model.SORT_COLUMNS:
            df = df.sort_values(by=sortby, ascending=ascend)
        df = df.head(limit)
        if show_chart:
            if external_axes is None:
                _, ax1 = plt.subplots(figsize=plot_autoscale(), dpi=PLOT_DPI)
            elif is_valid_axes_count(external_axes, 2):
                (ax1, _) = external_axes
            else:
                return
            for _, row in df[::-1].iterrows():
                ax1.barh(
                    y=row["GitHub"],
                    width=row["Forks" if chart_type == "forks" else "Stars"],
                )
            ax1.set_xlabel("Forks" if chart_type == "forks" else "Stars")
            ax1.get_xaxis().set_major_formatter(
                ticker.FuncFormatter(lambda x, _: lambda_long_number_format(x))
            )
            ax1.grid(axis="y")
            ax1.yaxis.set_label_position("left")
            ax1.yaxis.set_ticks_position("left")
            ax1.set_ylabel("Company")
            ax1.yaxis.set_tick_params(labelsize=8)
            title = "Total Forks" if chart_type == "forks" else "Total Stars"
            ax1.set_title(f"ROSS Index - {title}")
            if external_axes is None:
                theme.visualize_output()
        if show_growth:
            if external_axes is None:
                fig, ax = plt.subplots(figsize=plot_autoscale(), dpi=PLOT_DPI)
            elif is_valid_axes_count(external_axes, 2):
                (ax, _) = external_axes
            else:
                return
            for _, row in df[::-1].iterrows():
                ax.barh(
                    y=row["GitHub"],
                    width=row["FG" if chart_type == "forks" else "SG"],
                )
            ax.yaxis.set_label_position("left")
            ax.yaxis.set_ticks_position("left")
            ax.set_ylabel("Company")
            ax.set_xlabel("Annual Growth [times]")
            ax.yaxis.set_tick_params(labelsize=8)
            title = (
                "Forks Annual Growth"
                if chart_type == "forks"
                else "Stars Annual Growth"
            )
            ax.set_title(f"ROSS Index - {title}")
            fig.tight_layout()
            if external_axes is None:
                theme.visualize_output()
        show_df = df.drop(["SG", "FG"], axis=1)
        show_df = show_df.fillna("")
        show_df["GitHub"] = show_df["GitHub"].str.wrap(10)
        print_rich_table(
            show_df.head(limit),
            headers=list(show_df.columns),
            floatfmt=".1f",
            show_index=False,
            title="ROSS Index - the fastest-growing open-source startups",
        )

        export_data(
            export,
            os.path.dirname(os.path.abspath(__file__)),
            "runaidx",
            df,
        )
