# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.

from odoo.tests import tagged

from .common import TestCommonSaleTimesheet


@tagged('-at_install', 'post_install')
class TestUpsellWarning(TestCommonSaleTimesheet):
    def test_display_upsell_warning(self):
        """ Test to display an upsell warning


            We display an upsell warning in SO when this following condition is satisfy in its SOL:
            (qty_delivered / product_uom_qty) >= product_id.service_upsell_threshold

            Test Case:
            =========
            1) Configure the upsell warning in prepaid service product
            2) Create SO with a SOL containing this updated product,
            3) Create Project and Task,
            4) Timesheet in the task to satisfy the condition for the SOL to display an upsell warning,
            5) Check if the SO has an 'sale.mail_act_sale_upsell' activity.
        """
        # 1) Configure the upsell warning in prepaid service product
        self.product_order_timesheet1.write({
            'service_upsell_threshold': 0.5,
        })

        # 2) Create SO with a SOL containing this updated product
        so = self.env['sale.order'].create({
            'partner_id': self.partner_a.id,
            'partner_invoice_id': self.partner_a.id,
            'partner_shipping_id': self.partner_a.id,
        })

        self.env['sale.order.line'].create({
            'order_id': so.id,
            'product_id': self.product_order_timesheet1.id,
            'product_uom_qty': 10,
        })
        so.action_confirm()

        # 3) Create Project and Task
        project = self.env['project.project'].create({
            'name': 'Project',
            'allow_timesheets': True,
            'allow_billable': True,
            'partner_id': self.partner_a.id,
            'analytic_account_id': self.analytic_account_sale.id,
        })
        task = self.env['project.task'].create({
            'name': 'Task Test',
            'project_id': project.id,
        })
        task._compute_sale_line()

        # 4) Timesheet in the task to satisfy the condition for the SOL to display an upsell warning
        timesheet = self.env['account.analytic.line'].create({
            'name': 'Test Line',
            'unit_amount': 5,
            'employee_id': self.employee_manager.id,
            'project_id': project.id,
            'task_id': task.id,
        })
        timesheet._compute_so_line()
        so.order_line._compute_qty_delivered()
        so.order_line._compute_invoice_status()
        so._compute_invoice_status()
        # Normally this method is called at the end of _compute_invoice_status and other compute method. Here, we simulate for invoice_status field
        so._compute_field_value(so._fields['invoice_status'])

        self.assertEqual(len(so.activity_search(['sale.mail_act_sale_upsell'])), 0, 'No upsell warning should appear in the SO.')
        timesheet.write({
            'unit_amount': 6,
        })
        timesheet._compute_so_line()
        so.order_line._compute_qty_delivered()
        so.order_line._compute_invoice_status()
        so._compute_invoice_status()
        # Normally this method is called at the end of _compute_invoice_status and other compute method. Here, we simulate for invoice_status field
        so._compute_field_value(so._fields['invoice_status'])

        # 5) Check if the SO has an 'sale.mail_act_sale_upsell' activity.
        self.assertEqual(len(so.activity_search(['sale.mail_act_sale_upsell'])), 1, 'A upsell warning should appear in the SO.')

    def test_display_upsell_warning_when_invoiced(self):
        """ Test to display an upsell warning when threshold value (10000%) exceed while creating invoice.

            We display an upsell warning in SO when this following condition is satisfy in its SOL:
            (qty_delivered / product_uom_qty) >= product_id.service_upsell_threshold

            Test Case:
            =========
            1) Configure the upsell warning in prepaid service product
            2) Create SO with a SOL containing this updated product,
            3) Create Project and Task,
            4) Timesheet in the task to satisfy the condition for the SOL to display an upsell warning,
            5) Create Invoice of the SO,
            6) Check if the SO has an 'sale.mail_act_sale_upsell' activity.
        """

        # 1) Configure the upsell warning in prepaid service product with 100 (10000%)
        self.product_order_timesheet1.write({
            'service_upsell_threshold': 100,
        })

        # 2) Create SO with a SOL containing this updated product
        so = self.env['sale.order'].create({
            'partner_id': self.partner_a.id,
            'partner_invoice_id': self.partner_a.id,
            'partner_shipping_id': self.partner_a.id,
        })

        self.env['sale.order.line'].create({
            'order_id': so.id,
            'name': self.product_order_timesheet1.name,
            'product_id': self.product_order_timesheet1.id,
            'product_uom_qty': 1,
            'price_unit': self.product_order_timesheet1.list_price,
        })
        so.action_confirm()

        # 3) Create Project and Task
        project = self.env['project.project'].create({
            'name': 'Project',
            'allow_timesheets': True,
            'allow_billable': True,
            'partner_id': self.partner_a.id,
            'analytic_account_id': self.analytic_account_sale.id,
        })
        task = self.env['project.task'].create({
            'name': 'Task Test',
            'project_id': project.id,
            'sale_line_id': so.order_line.id
        })

        # 4) Timesheet in the task to satisfy the condition for the SOL to display an upsell warning
        self.env['account.analytic.line'].create({
            'name': 'Test Line',
            'unit_amount': 50,
            'employee_id': self.employee_manager.id,
            'project_id': project.id,
            'task_id': task.id,
        })
        so.order_line._compute_qty_delivered()

        # 5) Create Invoice of the SO
        so._create_invoices()
        # Normally this method is called at the end of _get_invoice_status and other compute method. Here, we simulate for invoice_status field
        so._compute_field_value(so._fields['invoice_status'])

        # 6) Check if the SO has an 'sale.mail_act_sale_upsell' activity.
        self.assertEqual(len(so.activity_search(['sale.mail_act_sale_upsell'])), 0, 'No upsell warning should appear in the SO.')
