import uuid
from models import *
from app import app, db, bcrypt
from misc_utils import *
from common import git_command
import os
import shutil
import config
import flask
import git
import subprocess
from flask_httpauth import HTTPBasicAuth
import zlib
import re
import datetime

auth = HTTPBasicAuth(realm=config.AUTH_REALM + " Data API")

api_app = flask.Blueprint("api_app", __name__, template_folder="templates/api/", url_prefix="/data-api/")


@auth.verify_password
def verify_password(username, password):
    user = User.query.filter_by(username=username).first()

    if user and bcrypt.check_password_hash(user.password_hashed, password):
        flask.g.user = username
        return True

    return False


@api_app.route("/", methods=["GET"])
def welcome():
    response = flask.make_response(flask.render_template("welcome.xml"))
    response.headers["Content-Type"] = "application/xml"
    return response


@api_app.route("/user/<username>/", methods=["GET"])
def get_user(username):
    response = flask.make_response(flask.render_template("user.xml", user=db.session.get(User, username)))
    response.headers["Content-Type"] = "application/xml"
    return response


@api_app.route("/user/<username>/repositories", methods=["GET"])
@auth.login_required(optional=True)
def get_user_repositories(username):
    user = db.session.get(User, username)
    page = flask.request.args.get("page", 1)
    page_size = flask.request.args.get("page_size", 64)
    if hasattr(flask.g, "user") and flask.g.user == username:
        repositories = Repo.query.filter_by(owner=user).paginate(page=page, per_page=page_size)
    else:
        repositories = Repo.query.filter_by(owner=user, visibility=2).paginate(page=page, per_page=page_size)
    response = flask.make_response(
            flask.render_template("user-repositories.xml", user=user,
                                  repositories=repositories.items, page=page, page_size=page_size)
    )
    response.headers["Content-Type"] = "application/xml"
    return response


app.register_blueprint(api_app)
