# Copyright 2016 Tecnativa - Pedro M. Baeza
# Copyright 2018 Tecnativa - Carlos Dauden
# Copyright 2018 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

import odoo.tests
from odoo import exceptions


@odoo.tests.at_install(False)
@odoo.tests.post_install(True)
class TestContractVariableQuantity(odoo.tests.HttpCase):
    def setUp(self):
        super(TestContractVariableQuantity, self).setUp()
        self.partner = self.env['res.partner'].create({'name': 'Test partner'})
        self.product = self.env['product.product'].create(
            {'name': 'Test product'}
        )
        self.contract = self.env['contract.contract'].create(
            {
                'name': 'Test Contract',
                'partner_id': self.partner.id,
                'pricelist_id': self.partner.property_product_pricelist.id,
            }
        )
        self.formula = self.env['contract.line.qty.formula'].create(
            {
                'name': 'Test formula',
                # For testing each of the possible variables
                'code': 'env["res.users"]\n'
                'context.get("lang")\n'
                'user.id\n'
                'line.qty_type\n'
                'contract.id\n'
                'quantity\n'
                'period_first_date\n'
                'period_last_date\n'
                'invoice_date\n'
                'result = 12',
            }
        )
        self.contract_line = self.env['contract.line'].create(
            {
                'contract_id': self.contract.id,
                'product_id': self.product.id,
                'name': 'Test',
                'qty_type': 'variable',
                'qty_formula_id': self.formula.id,
                'quantity': 1,
                'uom_id': self.product.uom_id.id,
                'price_unit': 100,
                'discount': 50,
                'recurring_rule_type': 'monthly',
                'recurring_interval': 1,
                'date_start': '2016-02-15',
                'recurring_next_date': '2016-02-29',
            }
        )

    def test_check_invalid_code(self):
        with self.assertRaises(exceptions.ValidationError):
            self.formula.code = "sdsds"

    def test_check_no_return_value(self):
        with self.assertRaises(exceptions.ValidationError):
            self.formula.code = "user.id"

    def test_check_variable_quantity(self):
        self.contract.recurring_create_invoice()
        invoice = self.contract._get_related_invoices()
        self.assertEqual(invoice.invoice_line_ids[0].quantity, 12)

    def test_check_skip_zero_qty(self):
        self.formula.code = 'result=0'
        self.contract.skip_zero_qty = True
        invoice = self.contract.recurring_create_invoice()
        self.assertFalse(invoice.invoice_line_ids)
        self.contract.skip_zero_qty = False
        invoice = self.contract.recurring_create_invoice()
        self.assertAlmostEqual(invoice.invoice_line_ids[0].quantity, 0.0)