from odoo.tests.common import TransactionCase


class TestMRPBOMAdd(TransactionCase):

    def setUp(self):
        super(TestMRPBOMAdd, self).setUp()
        self.attr1 = self.env['product.attribute'].create({
            'name': 'Test Attr1',
            'create_variant': 'always',
            'display_type': 'radio',
        })
        self.attr1_val1 = self.env['product.attribute.value'].create({
            'attribute_id': self.attr1.id,
            'name': 'Test Attr1 Val1'
        })
        self.attr1_val2 = self.env['product.attribute.value'].create({
            'attribute_id': self.attr1.id,
            'name': 'Test Attr2 Val1'
        })

        self.attr2 = self.env['product.attribute'].create({
            'name': 'Test Attr2',
            'create_variant': 'always',
            'display_type': 'radio',
        })
        self.attr2_val1 = self.env['product.attribute.value'].create({
            'attribute_id': self.attr2.id,
            'name': 'Test Attr2 Val1'
        })
        self.attr2_val2 = self.env['product.attribute.value'].create({
            'attribute_id': self.attr2.id,
            'name': 'Test Attr2 Val2'
        })

        # 2 variant product
        self.manufacture = self.env['product.template'].create({
            'name': 'Test Manufactured',
            'attribute_line_ids': [
                (0, 0, {
                    'attribute_id': self.attr1.id,
                    'value_ids': [(4, self.attr1_val1.id, 0)],
                }),
                (0, 0, {
                    'attribute_id': self.attr2.id,
                    'value_ids': [(4, self.attr2_val1.id, 0), (4, self.attr2_val2.id, 0)],
                }),
            ]
        })

        # 4 variant component
        self.component = self.env['product.template'].create({
            'name': 'Test Component',
            'attribute_line_ids': [
                (0, 0, {
                    'attribute_id': self.attr1.id,
                    'value_ids': [(4, self.attr1_val1.id, 0), (4, self.attr1_val2.id, 0)],
                }),
                (0, 0, {
                    'attribute_id': self.attr2.id,
                    'value_ids': [(4, self.attr2_val1.id, 0), (4, self.attr2_val2.id, 0)],
                }),
            ]
        })
        self.bom = self.env['mrp.bom'].create({
            'product_tmpl_id': self.manufacture.id,
            'product_qty': 1.0,
            'product_uom_id': self.manufacture.uom_id.id,
        })

    def test_internals(self):
        # Ensure BoM is empty
        self.assertEqual(len(self.bom.bom_line_ids), 0)
        wizard = self.env['mrp.bom.add'].create({
            'bom_id': self.bom.id,
        })
        wizard.product_tmpl_id = self.component
        self.assertEqual(wizard._compute_attribute_value_ids(),
                         self.component.mapped('attribute_line_ids.value_ids'))
        self.assertEqual(wizard._compute_product_ids(), self.component.product_variant_ids)
        wizard.limit_possible = True
        self.assertEqual(wizard._compute_attribute_value_ids(),
                         self.manufacture.mapped('attribute_line_ids.value_ids'))

    def test_main(self):
        # Ensure BoM is empty
        self.assertEqual(len(self.bom.bom_line_ids), 0)

        wizard = self.env['mrp.bom.add'].create({
            'bom_id': self.bom.id,
        })
        self.assertEqual(wizard.product_variant_count, 0)

        wizard.product_tmpl_id = self.component
        self.assertEqual(wizard.product_variant_count, 4)

        wizard.add_variants()
        self.assertEqual(len(self.bom.bom_line_ids), 4)

    def test_limited(self):
        # Ensure BoM is empty
        self.assertEqual(len(self.bom.bom_line_ids), 0)

        wizard = self.env['mrp.bom.add'].create({
            'bom_id': self.bom.id,
        })
        self.assertEqual(wizard.product_variant_count, 0)

        wizard.limit_possible = True
        wizard.product_tmpl_id = self.component
        self.assertEqual(wizard.product_variant_count, 2)

        wizard.add_variants()
        self.assertEqual(len(self.bom.bom_line_ids), 2)

    def test_replace(self):
        # Ensure BoM is empty
        self.assertEqual(len(self.bom.bom_line_ids), 0)

        wizard = self.env['mrp.bom.add'].create({
            'bom_id': self.bom.id,
        })

        wizard.product_tmpl_id = self.component
        self.assertEqual(wizard.product_variant_count, 4)

        wizard.add_variants()
        self.assertEqual(len(self.bom.bom_line_ids), 4)

        # Additive
        wizard.add_variants()
        self.assertEqual(len(self.bom.bom_line_ids), 8)

        # remove those 8 lines when adding new ones
        wizard.replace_existing = True
        wizard.add_variants()
        self.assertEqual(len(self.bom.bom_line_ids), 4)
