from rapidsms.apps.base import AppBase 
import re
import arrest

MAX_MSG_LEN = 160
DIGIT = re.compile(r"\d{1,3}")
PUNCT = re.compile(r"[^\w\s]")
"""
STYLE = {
    "start":   "-* ",
    "repeat": " -*- ",
    "end":     " *-"
}
"""

STYLE = {"start": "", "repeat": "; ", "end": ""}


ChaloBest = arrest.Client("http://chalobest.in/1.0")

class App(AppBase):
    def handle(self, msg):
        if DIGIT.search(msg.text):
            routes = ChaloBest.routes(q=msg.text.replace(" ", ""))
            if not routes:
                msg.respond("Sorry, we found no route marked '%(text)s'.", text=msg.text)
                return
            detail = ChaloBest.route[routes[0]]
            stops = detail['stops']['features']
            origin, dest = stops[0]['properties'], stops[-1]['properties']
            origin_name, dest_name = origin['display_name'], dest['display_name']
            origin_area, dest_area = PUNCT.sub('', origin['area']), PUNCT.sub('', dest['area'])
            msg.respond("%s: %s (%s) to %s (%s)" % (
                    ",".join(routes), origin_name, origin_area, dest_name, dest_area))
        else:
            features = ChaloBest.stops(q=msg.text)['features']
            if not features:
                msg.respond("Sorry, we found no stops marked '%(text)s'.", text=msg.text)
                return
            stops = []
            for feat in features:
                stop = feat['properties']
                if stops and stop["official_name"] == stops[-1]["official_name"]:
                    stops[-1]["routes"] += ", " + stop["routes"]
                else:
                    stops.append(stop)
            response = STYLE["start"]
            for stop in stops:
                match = stop["official_name"] + ": " + stop["routes"]
                if len(response) > len(STYLE["repeat"]): response += STYLE["repeat"]
                response += match
                if len(response) > MAX_MSG_LEN: break
            if len(response) > MAX_MSG_LEN:
                response = response[:MAX_MSG_LEN-(len(STYLE["end"])+4)] + "..."
            response += STYLE["end"]
            msg.respond(response)
