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

from odoo.tests.common import TransactionCase
from odoo.tests.common import tagged

from odoo.addons.l10n_es_partner_ccpae.models.res_partner import DEFAULT_CCPAE_ORGANISMO


@tagged("post_install", "-at_install")
class TestResPartnerCcpae(TransactionCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        cls.partner = cls.env["res.partner"].create(
            {
                "name": "Productor Ecològic Test",
                "is_company": True,
            }
        )
        # `create` crida `_track_discard()`, que apunta `None` com a valors
        # inicials del registre per no traçar la pròpia creació. Mentre aquest
        # `None` hi sigui, cap `write` posterior deixa rastre. Buidant el
        # precommit aquí es descarta i els tests ja poden traçar.
        cls._flush_tracking(cls.env)

    @staticmethod
    def _flush_tracking(env):
        env.flush_all()
        env.cr.precommit.run()

    def _tracked_fields(self):
        """Camps amb rastre al xatter del contacte, després d'un `write`.

        `mail.thread.write()` no crea el `mail.message` de seguiment al moment:
        el deixa encuat com a callback de precommit (és el que desencalla
        `MailCommon.flush_tracking` del core). I un cop creat cal invalidar el
        contacte, perquè `message_ids` ja s'havia llegit i el one2many es queda
        amb el valor antic a la memòria cau.
        """
        self._flush_tracking(self.env)
        self.partner.invalidate_recordset()
        return self.partner.message_ids.tracking_value_ids.mapped("field_id.name")

    def test_organismo_default(self):
        """Un contacte nou porta el codi del CCPAE per defecte."""
        self.assertEqual(self.partner.ccpae_organismo, DEFAULT_CCPAE_ORGANISMO)
        self.assertFalse(self.partner.ccpae_operador)

    def test_campos_con_seguimiento(self):
        """Escriure als camps CCPAE deixa rastre al xatter."""
        self.partner.write({"ccpae_operador": "CT-12345"})
        self.assertIn(
            "ccpae_operador",
            self._tracked_fields(),
            "El canvi de ccpae_operador ha de quedar registrat al xatter",
        )

        self.partner.write({"ccpae_organismo": "ES-ECO-020-CT"})
        self.assertIn("ccpae_organismo", self._tracked_fields())

    def test_vista_heredada_valida(self):
        """La vista heretada s'ancora bé al formulari de `base` de la 18.0."""
        view = self.env.ref("l10n_es_partner_ccpae.res_partner_view_form_ccpae")
        arch = self.env["res.partner"].get_view(view.id, "form")["arch"]
        self.assertIn("ccpae_operador", arch)
        self.assertIn("ccpae_organismo", arch)
