import pathlib
from typing import Callable, Iterable, Tuple

from teal.resource import Converters, Resource

from ereuse_devicehub.db import db
from ereuse_devicehub.resources.lot import schemas
from ereuse_devicehub.resources.lot.views import LotBaseChildrenView, LotChildrenView, \
    LotDeviceView, LotView


class LotDef(Resource):
    SCHEMA = schemas.Lot
    VIEW = LotView
    AUTH = True
    ID_CONVERTER = Converters.uuid

    def __init__(self, app, import_name=__name__.split('.')[0], static_folder=None,
                 static_url_path=None,
                 template_folder=None, url_prefix=None, subdomain=None, url_defaults=None,
                 root_path=None, cli_commands: Iterable[Tuple[Callable, str or None]] = tuple()):
        super().__init__(app, import_name, static_folder, static_url_path, template_folder,
                         url_prefix, subdomain, url_defaults, root_path, cli_commands)
        lot_children = LotChildrenView.as_view('lot-children', definition=self, auth=app.auth)
        if self.AUTH:
            lot_children = app.auth.requires_auth(lot_children)
        self.add_url_rule('/<{}:{}>/children'.format(self.ID_CONVERTER.value, self.ID_NAME),
                          view_func=lot_children,
                          methods={'POST', 'DELETE'})
        lot_device = LotDeviceView.as_view('lot-device', definition=self, auth=app.auth)
        if self.AUTH:
            lot_device = app.auth.requires_auth(lot_device)
        self.add_url_rule('/<{}:{}>/devices'.format(self.ID_CONVERTER.value, self.ID_NAME),
                          view_func=lot_device,
                          methods={'POST', 'DELETE'})

    def init_db(self, db: 'db.SQLAlchemy', exclude_schema=None):
        # Create functions
        with pathlib.Path(__file__).parent.joinpath('dag.sql').open() as f:
            sql = f.read()
            db.session.execute(sql)