from flask_restful import reqparse, abort, Resource
from . import db_session
from recources.Model.Dish import Dish

from flask import jsonify


def abort_if_dish_not_found(dish_id):
    db_sess = db_session.create_session()
    user = db_sess.query(Dish).get(dish_id)
    if not user:
        abort(404, message=f'Dish {dish_id} not found')


parser = reqparse.RequestParser()
parser.add_argument('name', required=True)
parser.add_argument("description", required=True)
parser.add_argument("image", required=True)
parser.add_argument("userId", required=True)
parser.add_argument("categoryId", required=True)


class DishResource(Resource):
    def get(self, dish_id):
        abort_if_dish_not_found(dish_id)
        db_sess = db_session.create_session()
        dish = db_sess.query(Dish)
        return jsonify(dish.to_dict())

    def delete(self, dish_id):
        abort_if_dish_not_found(dish_id)
        db_sess = db_session.create_session()
        dish = db_sess.query(Dish).get(dish_id)
        db_sess.delete(dish)
        db_sess.commit()
        return jsonify({'success': 'OK'})

    def put(self, dish_id):
        abort_if_dish_not_found(dish_id)
        args = parser.parse_args()
        db_sess = db_session.create_session()

        dish = db_sess.query(Dish).get(dish_id)
        dish.name = args["name"]
        dish.description = args["description"]
        dish.image = args["image"]
        dish.userId = args["userId"]
        dish.categoryId = args["categoryId"]

        db_sess.commit()

        return jsonify({'success': 'OK'})


class DishListResource(Resource):
    def get(self):
        session = db_session.create_session()
        categories = session.query(Dish).all()
        return jsonify([item.to_dict() for item in categories])

    def post(self):
        args = parser.parse_args()
        db_sess = db_session.create_session()

        dish = Dish()
        dish.name = args["name"]
        dish.description = args["description"]
        dish.image = args["image"].encode()
        dish.userId = args["userId"]
        dish.categoryId = args["categoryId"]

        db_sess.add(dish)
        db_sess.commit()

        return jsonify({'success': 'OK'})


class DishUserListResource(Resource):
    def get(self, user_id):
        session = db_session.create_session()
        categories = session.query(Dish).where(Dish.userId == user_id)
        return jsonify([item.to_dict() for item in categories])