import pandas as pd
import trino
from http.client import HTTPConnection
import datetime
import logging
import os
import typing as t


LOGGER_NAME = "nasdaqdatalink"


def create_connection(env: t.Dict[str, str]) -> trino.dbapi.Connection:
    """ Learn more: https://github.com/trinodb/trino-python-client#usage """

    host = env.get('NASDAQ_DATA_LINK_BASE_DOMAIN', 'data.nasdaq.com')
    port = 443 if 'nasdaq.com' in host else 80
    api_key = env.get('NASDAQ_DATA_LINK_API_KEY')
    if api_key is None:
        raise RuntimeError('NASDAQ_DATA_LINK_API_KEY environment variable must be defined.')

    return trino.dbapi.connect(
        host=host,
        port=port,
        user=api_key,
        catalog='main',
        schema='huron',
        http_scheme='https'
    )


def run_sql(
    connection: trino.dbapi.Connection,
    sql: str,
    params: t.Optional[t.Union[t.List[t.Any], t.Tuple[t.Any]]] = None
) -> pd.DataFrame:
    cur = connection.cursor()

    try:
        results = cur.execute(sql, params)
        df = pd.DataFrame(iter(results))
        df.columns = [c[0] for c in cur.description]
    finally:
        cur.close()

    return df


def main() -> None:
    env = os.environ.copy()

    if 'DEBUG' in env:
        logging.basicConfig()
        logging.getLogger().setLevel(logging.DEBUG)
        HTTPConnection.debuglevel = 1

    connection = create_connection(env)

    date = datetime.date(2022, 8, 25)

    # flake8: noqa: E501
    # Learn more: https://data.nasdaq.com/databases/RTAT/documentation?anchor=retail-trading-activity-tracker-daily-top-10-free-ndaq-rtat10-
    retail_activity = run_sql(connection, "SELECT * FROM ndaq_rtat10 WHERE date = ? LIMIT 10", [date])
    print(retail_activity)

    # Learn more: https://data.nasdaq.com/databases/ZHDM/documentation?anchor=historical-daily-maintenance-zacks-hdm-
    corp_actions = run_sql(connection, "SELECT * FROM zacks_hdm WHERE ex_date = ? LIMIT 10", [date])
    print(corp_actions)

    sql = """
    SELECT
        r.activity,
        r.sentiment,
        z.*
    FROM
        ndaq_rtat10 r
            INNER JOIN
        zacks_hdm z ON z.ticker = r.ticker AND z.ex_date = r.date
    WHERE
        date = ?
    """
    joined = run_sql(connection, sql, [date])
    print(joined.head(10))


if __name__ == '__main__':
    main()
