import os
import json
from flask import Flask, redirect, abort, request, make_response, render_template, session
import urllib

import base
import rest
import auth
from config import cfg, gcfg

app = Flask(__name__, static_folder="./images")
app.secret_key=os.urandom(16)

ZSListFrFURL = base.joinURL(gcfg.get("zserver","addr"), "fs/listfrf")
ZSSearchUSURL = base.joinURL(gcfg.get("zserver","addr"), "userver/search")
USDownloadFURI = "/fs/downloadf/"


def readextension(fdir):
    fdirlower = fdir.lower()
    if fdirlower.endswith("jpg") : return "jpg"
    elif fdirlower.endswith("png") : return "png"
    elif fdirlower.endswith("gif") : return "gif"
    elif fdirlower.endswith("mp4") : return "mp4"
    else : return ""


@app.route("/", methods=["POST"])
def default():
    # zsaddr = request.form.get("zsaddr")
    token = request.form.get("token")
    if token == "": abort(401)
    if not auth.checktoken(token): abort(401)

    session["token"] = token
    return redirect("/folder?fddir=/&filter=")


@app.route("/folder", methods=["GET"])
def folder():
    token = session["token"]
    if token == "": abort(401)
    if not auth.checktoken(token): abort(401)

    fddir = request.args.get("fddir")
    filter = request.args.get("filter")
    filter=filter.strip()
    
    iminfo = {}
    fds = []
    imgs = []
    vdos = []
    try:
        param = json.dumps({"dir": fddir})
        resp = rest.post(ZSListFrFURL, param, token)
        fdlistinfo = json.loads(resp)
    
        for fd in fdlistinfo["folders"]:
            fds.append(fd)

        if filter == "":
            for f in fdlistinfo["files"]:
                ext = readextension(f)
                if ext == "mp4":
                    vdos.append(f)
                elif not ext == "":
                    imgs.append(f)
        else:
            for f in fdlistinfo["files"]:
                if filter in f:
                    ext = readextension(f)
                    if ext == "mp4":
                        vdos.append(f)
                    elif not ext == "":
                        imgs.append(f)
    
    except Exception as e:
        abort(400)
    
    iminfo["fddir"] = fddir
    iminfo["filter"] = filter
    iminfo["fds"] = fds
    iminfo["imgs"] = imgs
    iminfo["vdos"] = vdos
    return render_template("default.html", **iminfo)


@app.route("/file", methods=["GET"])
def fileproxy():
    token = session["token"]
    if token == "": abort(401)
    if not auth.checktoken(token): abort(401)
        
    fdir = request.args.get("fdir")
    if fdir == "": abort(401)

    tstr = base.spliteNName(fdir)
    nname = tstr[0]
    nfdir = tstr[1]

    searchusurl = base.joinURL(ZSSearchUSURL, nname)
    resp = rest.get(searchusurl, token)
    usi = json.loads(resp)
    usaddr = usi["endpoint"]
    if usaddr == "": abort(401)

    usurl = base.joinURL(usaddr, USDownloadFURI)
    usurl = usurl + "?dir=" + urllib.parse.quote(nfdir)
    req = urllib.request.Request(usurl)
    req.add_header("Content-Type", "application/json;charset:utf-8;")
    req.add_header('Authorization', token)
    response = urllib.request.urlopen(req)
    return response


if __name__ == "__main__":
    port = cfg.getint("server","port")
    
    app.run(
        host = "0.0.0.0",
        port = port,
        debug = True
    )

