"""$<ticker symbol> for a quote on a stock price"""
from __future__ import print_function
import logging
import re
try:
    from urllib import quote
except ImportError:
    from urllib.request import quote

from bs4 import BeautifulSoup
import requests

logger = logging.getLogger(__name__)


def stockprice(ticker):
    url = "https://www.google.com/finance?q={0}"
    soup = BeautifulSoup(
        requests.get(url.format(quote(ticker))).text, "html5lib")

    try:
        company, ticker = re.findall(u"^(.+?)\xa0\xa0(.+?)\xa0", soup.text,
                                     re.M)[0]
    except IndexError:
        logging.info("Unable to find stock {0}".format(ticker))
        return ""
    price = soup.select("#price-panel .pr span")[0].text
    change, pct = soup.select("#price-panel .nwp span")[0].text.split()
    time = " ".join(soup.select(".mdata-dis")[0].parent.text.split()[:4])
    pct.strip('()')

    emoji = ":chart_with_upwards_trend:" if change.startswith("+") \
            else ":chart_with_downwards_trend:"

    return "{0} {1} {2}: {3} {4} {5} {6} {7}".format(
        emoji, company, ticker, price, change, pct, time, emoji)


def on_message(msg, server):
    text = msg.get("text", "")
    basic_re = r"\B\$([a-zA-Z]\w{0,3}(?:\.\w{1,3})?)\b"
    # slack linkifies some tickers, which results in: $<http://wbc.ax|wbc.ax>
    link_re = r"\$<http://([a-zA-Z]\w{0,3}(?:\.\w{1,3})?)\|"
    matches = re.findall(r"{}|{}".format(basic_re, link_re, text), text)
    if not matches:
        return

    tickers = (''.join(list(x)).encode("utf8") for x in matches)
    prices = (stockprice(ticker) for ticker in tickers)
    return "\n".join(p for p in prices if p)


on_bot_message = on_message