# Copyright 2017 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).

from odoo import models
from odoo.exceptions import ValidationError


class IrQWeb(models.AbstractModel):
    _inherit = "ir.qweb"

    def check_length(self, value, min_length=False, max_length=False):  # noqa
        """No use staticmethod because self is needed to translate exception messages"""
        if min_length and len(value) < min_length:
            raise ValidationError(
                self.env._("Length cannot be less than %s", min_length)
            )
        if max_length and len(value) > max_length:
            raise ValidationError(
                self.env._("Length cannot be more than %s", max_length)
            )
        return value

    def _compile_directive_esc(self, el, compile_context, level):
        min_value = el.attrib.pop("t-minlength", False)
        max_value = el.attrib.pop("t-maxlength", False)
        if min_value or max_value:
            el.attrib["t-esc"] = (
                'docs.env["ir.qweb"].check_length('
                + el.attrib["t-esc"]
                + ", "
                + (min_value or "False")
                + ", "
                + (max_value or "False")
                + ")"
            )
        if "t-length" in el.attrib:
            tlength = el.attrib.pop("t-length")
            el.attrib["t-esc"] = "(" + el.attrib["t-esc"] + ")[:" + tlength + "]"
        return super()._compile_directive_esc(el, compile_context, level)

    def _compile_directive_out(self, el, compile_context, level):
        min_value = el.attrib.pop("t-minlength", False)
        max_value = el.attrib.pop("t-maxlength", False)
        if min_value or max_value:
            el.attrib["t-out"] = (
                'docs.env["ir.qweb"].check_length('
                + el.attrib["t-out"]
                + ", "
                + (min_value or "False")
                + ", "
                + (max_value or "False")
                + ")"
            )
        if "t-length" in el.attrib:
            tlength = el.attrib.pop("t-length")
            el.attrib["t-out"] = "(" + el.attrib["t-out"] + ")[:" + tlength + "]"
        return super()._compile_directive_out(el, compile_context, level)

    def _compile_directive_raw(self, el, compile_context, level):
        # TODO: t-raw is deprecated, can it be removed?
        min_value = el.attrib.pop("t-minlength", False)
        max_value = el.attrib.pop("t-maxlength", False)
        if min_value or max_value:
            el.attrib["t-raw"] = (
                'docs.env["ir.qweb"].check_length('
                + el.attrib["t-raw"]
                + ", "
                + (min_value or "False")
                + ", "
                + (max_value or "False")
                + ")"
            )
        if "t-length" in el.attrib:
            tlength = el.attrib.pop("t-length")
            el.attrib["t-raw"] = "(" + el.attrib["t-raw"] + ")[:" + tlength + "]"
        return super()._compile_directive_raw(el, compile_context, level)
