from odoo.addons.account.tests.common import AccountTestInvoicingCommon
from odoo.tests import tagged
import logging

_logger = logging.getLogger(__name__)

@tagged('post_install_l10n', 'post_install', '-at_install')
class TestReports(AccountTestInvoicingCommon):

    @classmethod
    def setUpClass(cls, chart_template_ref="in"):
        super().setUpClass(chart_template_ref=chart_template_ref)
        country_in_id = cls.env.ref("base.in").id
        cls.company_data["company"].write({
            "vat": "24AAGCC7144L6ZE",
            "state_id": cls.env.ref("base.state_in_gj").id,
            "street": "street1",
            "city": "city1",
            "zip": "123456",
            "country_id": country_in_id,
        })
        cls.env.company = cls.company_data["company"]
        cls.partner_a.write({
            'vat': '27DJMPM8965E1ZE',
            'l10n_in_gst_treatment':'regular',
            'state_id': cls.env.ref("base.state_in_mh"),
            'country_id':country_in_id,
        })
        cls.partner_b.write({
            'vat': '24ABCPM8965E1ZE',
            'l10n_in_gst_treatment':'composition',
            'state_id': cls.env.ref("base.state_in_hp"),
            'country_id':country_in_id,
        })
        cls.partner_c = cls.env['res.partner'].create({
            'name': "Overseas partner",
            'l10n_in_gst_treatment':'overseas',
            'state_id': cls.env.ref("base.state_us_1").id,
            'country_id': cls.env.ref("base.us").id,
            'zip': "123456",
        })
        cls.igst_sale_18 = cls.env['account.chart.template'].ref('igst_sale_18')

    def test_partner_details_change_with_invoice(self):
        invoice_1 = self.init_invoice(
            move_type='out_invoice',
            partner=self.partner_a,
            amounts=[125, 300, 404],
            taxes=[self.igst_sale_18]
        )
        invoice_2 = self.init_invoice(
            move_type='out_invoice',
            partner=self.partner_a,
            amounts=[250, 600],
            taxes=[self.igst_sale_18],
            post=True
        )
        # Place of Supply (pos) is same as of state of partner (for journal type sale)
        expected_pos_id = self.env.ref("base.state_in_mh").id
        self.assertRecordValues(
            invoice_1,
            [{
                'state': 'draft',
                'l10n_in_gst_treatment': self.partner_a.l10n_in_gst_treatment,
                'l10n_in_state_id': expected_pos_id,
            }]
        )
        self.assertRecordValues(
            invoice_2,
            [{
                'state': 'posted',
                'l10n_in_gst_treatment': self.partner_a.l10n_in_gst_treatment,
                'l10n_in_state_id': expected_pos_id,
            }]
        )
        self.partner_a.write({
            'vat': False,
            'l10n_in_gst_treatment': 'unregistered',
            'state_id': self.env.ref("base.state_in_tn"), # change state of partner
        })
        self.assertRecordValues(
            invoice_1,
            [{
                'state': 'draft',
                'l10n_in_gst_treatment': self.partner_a.l10n_in_gst_treatment,
                'l10n_in_state_id': expected_pos_id, # POS doesn't change unless the partner changes
            }]
        )
        self.assertRecordValues(
            invoice_2,
            [{ # check gst treatment and pos doesn't change on posted invoice
                'state': 'posted',
                'l10n_in_gst_treatment': 'regular',
            }]
        )
        invoice_2.button_draft()
        self.assertRecordValues(invoice_2, [{
            'state': 'draft',
            'l10n_in_gst_treatment': self.partner_a.l10n_in_gst_treatment,
            'l10n_in_state_id': expected_pos_id,
        }])

    def test_partner_change_with_invoice(self):
        out_invoice = self.init_invoice(
            move_type='out_invoice',
            partner=self.partner_b,
            amounts=[40, 160, 25],
            taxes=[self.igst_sale_18]
        )
        in_invoice = self.init_invoice(
            move_type='in_invoice',
            partner=self.partner_a,
            amounts=[452, 58, 110],
            taxes=[self.igst_sale_18],
        )

        self.assertRecordValues(
            out_invoice,
            [{
                'state': 'draft',
                'l10n_in_gst_treatment': self.partner_b.l10n_in_gst_treatment,
                'l10n_in_state_id': self.env.ref("base.state_in_hp").id,
            }]
        )
        out_invoice.partner_id = self.partner_c
        self.assertRecordValues(
            out_invoice,
            [{
                'state': 'draft',
                'l10n_in_gst_treatment': self.partner_c.l10n_in_gst_treatment,
                'l10n_in_state_id': self.env.ref("l10n_in.state_in_oc").id,
            }]
        )
        self.assertRecordValues(
            in_invoice,
            [{
                'state': 'draft',
                'l10n_in_gst_treatment': self.partner_a.l10n_in_gst_treatment,
                'l10n_in_state_id': self.env.company.state_id.id,
            }]
        )

    def test_place_of_supply(self):
        invoice = self.init_invoice(
            move_type='out_invoice',
            partner=self.partner_b,
        )

        child_partner = self.env['res.partner'].create({
            'name': "Child Contact",
            'type': "delivery",
            'parent_id': self.partner_b.id,
            'state_id': self.env.ref("base.state_in_gj").id
        })

        self.assertRecordValues(
            invoice,
            [{
                'partner_shipping_id': self.partner_b.id,
                'l10n_in_state_id': self.partner_b.state_id.id,
            }]
        )
        invoice.partner_shipping_id = child_partner
        self.assertRecordValues(
            invoice,
            [{
                'partner_shipping_id': child_partner.id,
                'l10n_in_state_id': child_partner.state_id.id,
            }]
        )
        invoice.partner_shipping_id = self.partner_a
        self.assertRecordValues(
            invoice,
            [{
                'l10n_in_state_id': self.partner_b.state_id.id,
            }]
        )
