# Copyright 2025 Criptomart
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)


from odoo.tests.common import TransactionCase


class TestProductExtension(TransactionCase):
    """Test suite para las extensiones de product.template."""

    def setUp(self):
        super().setUp()
        self.product = self.env["product.product"].create(
            {
                "name": "Test Product",
            }
        )
        self.order = self.env["group.order"].create(
            {"name": "Test Order", "product_ids": [(4, self.product.id)]}
        )

    def test_product_template_group_order_ids_field_exists(self):
        """Test que el campo group_order_ids existe en product.template."""
        product_template = self.product.product_tmpl_id

        # El campo debe existir y ser readonly
        self.assertTrue(hasattr(product_template, "group_order_ids"))

    def test_product_group_order_ids_readonly(self):
        """Test that group_order_ids is a readonly field"""
        field = self.env["product.template"]._fields["group_order_ids"]
        self.assertTrue(field.readonly)

    def test_product_group_order_ids_reverse_lookup(self):
        """Test that adding a product to an order reflects in group_order_ids"""
        related_orders = self.product.product_tmpl_id.group_order_ids
        self.assertIn(self.order, related_orders)

    def test_product_group_order_ids_empty_by_default(self):
        """Test that a new product has no group orders"""
        new_product = self.env["product.product"].create({"name": "New Product"})
        self.assertFalse(new_product.product_tmpl_id.group_order_ids)

    def test_product_group_order_ids_multiple_orders(self):
        """Test that group_order_ids can contain multiple orders"""
        order2 = self.env["group.order"].create(
            {"name": "Test Order 2", "product_ids": [(4, self.product.id)]}
        )
        self.assertIn(self.order, self.product.product_tmpl_id.group_order_ids)
        self.assertIn(order2, self.product.product_tmpl_id.group_order_ids)

    def test_product_group_order_ids_empty_after_remove_from_order(self):
        """Test that group_order_ids is empty after removing the product from all orders"""
        self.order.write({"product_ids": [(3, self.product.id)]})
        self.assertFalse(self.product.product_tmpl_id.group_order_ids)

    def test_product_group_order_ids_with_multiple_products(self):
        """Test group_order_ids with multiple products in one order"""
        product2 = self.env["product.product"].create({"name": "Test Product 2"})
        self.order.write({"product_ids": [(4, self.product.id), (4, product2.id)]})
        self.assertIn(self.order, self.product.product_tmpl_id.group_order_ids)
        self.assertIn(self.order, product2.product_tmpl_id.group_order_ids)

    def test_product_with_variants_group_order_ids(self):
        """Test that group_order_ids works correctly with product variants"""
        # Create a product template with two variants
        product_template = self.env["product.template"].create(
            {
                "name": "Product with Variants",
                "attribute_line_ids": [
                    (
                        0,
                        0,
                        {
                            "attribute_id": self.env.ref(
                                "product.product_attribute_1"
                            ).id,
                            "value_ids": [
                                (
                                    4,
                                    self.env.ref(
                                        "product.product_attribute_value_1"
                                    ).id,
                                ),
                                (
                                    4,
                                    self.env.ref(
                                        "product.product_attribute_value_2"
                                    ).id,
                                ),
                            ],
                        },
                    )
                ],
            }
        )
        variant1 = product_template.product_variant_ids[0]
        variant2 = product_template.product_variant_ids[1]

        # Add one variant to an order (store variant id, not template id)
        order_with_variant = self.env["group.order"].create(
            {"name": "Order with Variant", "product_ids": [(4, variant1.id)]}
        )

        # Check that the order appears in the group_order_ids of the template
        self.assertIn(order_with_variant, product_template.group_order_ids)

        # Check that the order also appears for both variants (as it's a related field on template)
        related_orders_v1 = variant1.product_tmpl_id.group_order_ids
        related_orders_v2 = variant2.product_tmpl_id.group_order_ids
        self.assertIn(order_with_variant, related_orders_v1)
        self.assertIn(order_with_variant, related_orders_v2)
