from flask import request, abort, make_response
from flask.views import View

from pycs.database.Database import Database
from pycs.frontend.notifications.NotificationManager import NotificationManager


class EditLabelParent(View):
    """
    edit a labels name
    """
    # pylint: disable=arguments-differ
    methods = ['POST']

    def __init__(self, db: Database, nm: NotificationManager):
        # pylint: disable=invalid-name
        self.db = db
        self.nm = nm

    def dispatch_request(self, project_id: int, label_id: int):
        # extract request data
        data = request.get_json(force=True)

        if 'parent' not in data:
            abort(400)

        # find project
        project = self.db.project(project_id)
        if project is None:
            abort(404)

        # find label
        label = project.label(label_id)
        if label is None:
            abort(404)

        # start transaction
        with self.db:
            # change parent
            label.set_parent(data['parent'])

        # send notification
        self.nm.edit_label(label)

        # return success response
        return make_response()
