import app.core.http_codes as codes
import app.database.controller as dbc
from app.apis import admin_required, item_response, list_response
from app.core.dto import UserDTO
from app.core.parsers import user_parser, user_search_parser
from app.database.models import User
from flask import request
from flask_jwt_extended import get_jwt_identity, jwt_required
from flask_restx import Namespace, Resource

api = UserDTO.api
schema = UserDTO.schema
list_schema = UserDTO.list_schema


def edit_user(item_user, args):
    email = args.get("email")
    if email:
        if User.query.filter(User.email == args["email"]).count() > 0:
            api.abort(codes.BAD_REQUEST, "Email is already in use")

    return dbc.edit.user(item_user, **args)


@api.route("/")
class UsersList(Resource):
    @jwt_required
    def get(self):
        item = dbc.get.user(get_jwt_identity())
        return item_response(schema.dump(item))

    @jwt_required
    def put(self):
        args = user_parser.parse_args(strict=True)
        item = dbc.get.user(get_jwt_identity())
        item = edit_user(item, args)
        return item_response(schema.dump(item))


@api.route("/<ID>")
@api.param("ID")
class Users(Resource):
    @jwt_required
    def get(self, ID):
        item = dbc.get.user(ID)
        return item_response(schema.dump(item))

    @jwt_required
    def put(self, ID):
        args = user_parser.parse_args(strict=True)
        item = dbc.get.user(ID)
        item = edit_user(item, args)
        return item_response(schema.dump(item))


@api.route("/search")
class UserSearch(Resource):
    @jwt_required
    def get(self):
        args = user_search_parser.parse_args(strict=True)
        items, total = dbc.search.user(**args)
        return list_response(list_schema.dump(items), total)