"""
Routes and views for the flask application.
"""

from datetime import datetime, timedelta
from flask import render_template, request, abort, jsonify
import flask
from BikeParkingMapAPI import app
from BikeParkingMapAPI.controller import controller
import json

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
   LocationAction, QuickReply, QuickReplyButton, ButtonsTemplate, CarouselColumn, MessageEvent, TextMessage, LocationMessage,TextSendMessage,URIAction,TemplateSendMessage,CarouselTemplate
)
import traceback
import logging.config
logging.config.fileConfig("/var/www/bike-ojisan.f5.si/logging.config")
logger = logging.getLogger()

ACCESS_TOKEN = controller().getSystemSetting("ACCESS_TOKEN")
CHANNEL_SECRET = controller().getSystemSetting("CHANNEL_SECRET")
line_bot_api = LineBotApi(ACCESS_TOKEN)
handler = WebhookHandler(CHANNEL_SECRET)

@app.route('/')
@app.route('/healthcheck')
def healthcheck():
    result = "OK" if controller().healthcheck() else "NG"
    return result


@app.route('/api/getplace')
def getInfo():
    lat = request.args.get("lat")
    lon = request.args.get("lon")

    if lat == None or len(lat) == 0 or lon == None or len(lon) == 0:
        abort(400)
    
    data = controller().getData(lat,lon)
    routeFmt = "http://www.google.com/maps/dir/?api=1&destination={},{}"
    elements = [
        {"name":i["_source"]["Name"],
        "lat":i["_source"]["Location"][1],
        "lng":i["_source"]["Location"][0],
        "Address":i["_source"]["Address"],
        "FeeDetail":i["_source"]["FeeDetail"],
        "Capacity":i["_source"]["Capacity"],
        "RouteURL":routeFmt.format(i["_source"]["Location"][1],i["_source"]["Location"][0]),
        "SiteUrl":i["_source"]["SiteUrl"],
        "VehicleRestrictions":i["_source"]["VehicleRestrictions"],
        "isReserve":("予約" in i["_source"]["Name"])} for i in data]

    return jsonify(elements)


@app.route('/map')
def about():
    lat = request.args.get("lat")
    lon = request.args.get("lon")
    token = request.args.get("tkn")
    test = request.args.get("test")

    istest = test != None and test.lower() == "true"

    if not istest:
        if not (controller().checkargs((lat,lon,token)) and controller().checktoken(token)):
            abort(400)
    
    center = {"lat":float(lat),"lng":float(lon)}

    """Renders the about page."""
    return render_template(
        'map.html',
        ct=center,
        istest=istest
    )

@app.route('/api/LINEMessage',methods=["POST"])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    logger.info("Request body: " + body)
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)
    return 'OK'


@handler.add(MessageEvent, message=[LocationMessage])
def handle_message(event):

    ## クエリパラメータを取得する ##
    lat = event.message.latitude
    lon = event.message.longitude

    ## メインロジックを処理するためのコンスタラクタを定義 ##
    usrid = event.source.user_id
    ttltime = datetime.now() + timedelta(minutes=30)
    token = controller().setToken(request.headers,ttltime)
    retUrl = f"{flask.request.host_url}map?lat={lat}&lon={lon}&tkn={token}"
    ## メッセージを作成 ##
    mes = TextSendMessage(text=retUrl)
    line_bot_api.reply_message(event.reply_token, messages=mes)