# Copyright 2014 Numérigraphe
# Copyright 2016 Sodexis
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from odoo import api, fields, models

from odoo.addons.stock.models.product import OPERATORS


class ProductTemplate(models.Model):
    _inherit = "product.template"

    @api.depends(
        "product_variant_ids.immediately_usable_qty",
        "product_variant_ids.potential_qty",
    )
    def _compute_available_quantities(self):
        res = self._compute_available_quantities_dict()
        for product in self:
            for key, value in res[product.id].items():
                if key in product._fields:
                    product[key] = value

    def _compute_available_quantities_dict(self):
        variants_dict, _ = self.mapped(
            "product_variant_ids"
        )._compute_available_quantities_dict()
        res = {}
        for template in self:
            immediately_usable_qty = sum(
                variants_dict[p.id]["immediately_usable_qty"]
                - variants_dict[p.id]["potential_qty"]
                for p in template.product_variant_ids
            )
            potential_qty = max(
                [
                    variants_dict[p.id]["potential_qty"]
                    for p in template.product_variant_ids
                ]
                or [0.0]
            )
            res[template.id] = {
                "immediately_usable_qty": immediately_usable_qty + potential_qty,
                "potential_qty": potential_qty,
            }
        return res

    immediately_usable_qty = fields.Float(
        digits="Product Unit of Measure",
        compute="_compute_available_quantities",
        search="_search_immediately_usable_qty",
        string="Available to promise",
        help="Stock for this Product that can be safely proposed "
        "for sale to Customers.\n"
        "The definition of this value can be configured to suit "
        "your needs",
    )
    potential_qty = fields.Float(
        compute="_compute_available_quantities",
        digits="Product Unit of Measure",
        string="Potential",
        help="Quantity of this Product that could be produced using "
        "the materials already at hand. "
        "If the product has several variants, this will be the biggest "
        "quantity that can be made for a any single variant.",
    )

    @api.model
    def _search_immediately_usable_qty(self, operator, value):
        """Search function for the immediately_usable_qty field.
        The search is quite similar to the Odoo search about quantity available
        (addons/stock/models/product.py,253; _search_product_quantity function)
        :param operator: str
        :param value: str
        :return: list of tuple (domain)
        """
        products = self.search([])
        # Force prefetch
        products.mapped("immediately_usable_qty")
        product_ids = []
        for product in products:
            if OPERATORS[operator](product.immediately_usable_qty, value):
                product_ids.append(product.id)
        return [("id", "in", product_ids)]
