from flask import g
from flask_wtf import FlaskForm
from wtforms import IntegerField, StringField, validators

from ereuse_devicehub.db import db
from ereuse_devicehub.resources.device.models import Device
from ereuse_devicehub.resources.tag.model import Tag


class TagForm(FlaskForm):
    code = StringField('Code', [validators.length(min=1)])

    def validate(self, extra_validators=None):
        error = ["This value is being used"]
        is_valid = super().validate(extra_validators)
        if not is_valid:
            return False
        tag = Tag.query.filter(Tag.id == self.code.data).all()
        if tag:
            self.code.errors = error
            return False

        return True

    def save(self):
        self.instance = Tag(id=self.code.data)
        db.session.add(self.instance)
        db.session.commit()
        return self.instance

    def remove(self):
        if not self.instance.device and not self.instance.provider:
            self.instance.delete()
            db.session.commit()
        return self.instance


class TagUnnamedForm(FlaskForm):
    amount = IntegerField('amount')

    def save(self):
        num = self.amount.data
        tags_id, _ = g.tag_provider.post('/', {}, query=[('num', num)])
        tags = [Tag(id=tag_id, provider=g.inventory.tag_provider) for tag_id in tags_id]
        db.session.add_all(tags)
        db.session.commit()
        return tags


class PrintLabelsForm(FlaskForm):
    devices = StringField(render_kw={'class': "devicesList d-none"})

    def validate(self, extra_validators=None):
        is_valid = super().validate(extra_validators)

        if not self.devices.data:
            return False

        device_ids = self.devices.data.split(",")
        self._devices = (
            Device.query.filter(Device.id.in_(device_ids))
            .filter(Device.owner_id == g.user.id)
            .distinct()
            .all()
        )

        if not self._devices:
            return False

        return is_valid