# Copyright 2017, Inderpreet Singh, All rights reserved.

from bottle import HTTPResponse
from urllib.parse import unquote

from common import overrides
from controller import AutoQueuePersist, AutoQueuePattern
from ..web_app import IHandler, WebApp
from ..serialize import SerializeAutoQueue


class AutoQueueHandler(IHandler):
    def __init__(self, auto_queue_persist: AutoQueuePersist):
        self.__auto_queue_persist = auto_queue_persist

    @overrides(IHandler)
    def add_routes(self, web_app: WebApp):
        web_app.add_handler("/server/autoqueue/get", self.__handle_get_autoqueue)
        web_app.add_handler("/server/autoqueue/add/<pattern>", self.__handle_add_autoqueue)
        web_app.add_handler("/server/autoqueue/remove/<pattern>", self.__handle_remove_autoqueue)

    def __handle_get_autoqueue(self):
        patterns = list(self.__auto_queue_persist.patterns)
        patterns.sort(key=lambda p: p.pattern)
        out_json = SerializeAutoQueue.patterns(patterns)
        return HTTPResponse(body=out_json)

    def __handle_add_autoqueue(self, pattern: str):
        # value is double encoded
        pattern = unquote(pattern)

        aqp = AutoQueuePattern(pattern=pattern)

        if aqp in self.__auto_queue_persist.patterns:
            return HTTPResponse(body="Auto-queue pattern '{}' already exists.".format(pattern), status=400)
        else:
            try:
                self.__auto_queue_persist.add_pattern(aqp)
                return HTTPResponse(body="Added auto-queue pattern '{}'.".format(pattern))
            except ValueError as e:
                return HTTPResponse(body=str(e), status=400)

    def __handle_remove_autoqueue(self, pattern: str):
        # value is double encoded
        pattern = unquote(pattern)

        aqp = AutoQueuePattern(pattern=pattern)

        if aqp not in self.__auto_queue_persist.patterns:
            return HTTPResponse(body="Auto-queue pattern '{}' doesn't exist.".format(pattern), status=400)
        else:
            self.__auto_queue_persist.remove_pattern(aqp)
            return HTTPResponse(body="Removed auto-queue pattern '{}'.".format(pattern))