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

from odoo.tests.common import TransactionCase


class TestResPartnerExtension(TransactionCase):
    """Test suite para la extensión res.partner (user-group relationship)."""

    def setUp(self):
        super().setUp()
        # Crear grupos (res.partner with is_group=True)
        self.group1 = self.env["res.partner"].create(
            {
                "name": "Grupo 1",
                "is_company": True,
                "is_group": True,
                "email": "grupo1@test.com",
            }
        )

        self.group2 = self.env["res.partner"].create(
            {
                "name": "Grupo 2",
                "is_company": True,
                "is_group": True,
                "email": "grupo2@test.com",
            }
        )

        # Crear usuario
        self.user = self.env["res.users"].create(
            {
                "name": "Test User",
                "login": "testuser@test.com",
                "email": "testuser@test.com",
            }
        )

    def test_partner_can_belong_to_groups(self):
        """Test que un partner (usuario) puede pertenecer a múltiples grupos."""
        partner = self.user.partner_id

        # Agregar partner a grupos usando group_ids (desde el lado del miembro)
        partner.group_ids = [(6, 0, [self.group1.id, self.group2.id])]

        # Verificar que pertenece a ambos grupos
        self.assertIn(self.group1, partner.group_ids)
        self.assertIn(self.group2, partner.group_ids)
        self.assertEqual(len(partner.group_ids), 2)

    def test_group_can_have_multiple_members(self):
        """Test que un grupo puede tener múltiples miembros."""
        user2 = self.env["res.users"].create(
            {
                "name": "Test User 2",
                "login": "testuser2@test.com",
                "email": "testuser2@test.com",
            }
        )

        # Agregar miembros al grupo usando member_ids (desde el lado del grupo)
        self.group1.member_ids = [
            (6, 0, [self.user.partner_id.id, user2.partner_id.id])
        ]

        # Verificar que el grupo tiene ambos miembros
        self.assertIn(self.user.partner_id, self.group1.member_ids)
        self.assertIn(user2.partner_id, self.group1.member_ids)
        self.assertEqual(len(self.group1.member_ids), 2)

    def test_user_group_relationship_is_bidirectional(self):
        """Test que se puede modificar la relación desde el lado del partner o el grupo."""
        partner = self.user.partner_id

        # Opción 1: Agregar grupo al usuario (desde el lado del miembro/partner)
        partner.group_ids = [(6, 0, [self.group1.id])]
        self.assertIn(self.group1, partner.group_ids)

        # Verificar que la relación inversa también funciona
        self.assertIn(partner, self.group1.member_ids)

        # Opción 2: Agregar partner al grupo (desde el lado del grupo)
        user2 = self.env["res.users"].create(
            {
                "name": "Test User 2",
                "login": "testuser2@test.com",
                "email": "testuser2@test.com",
            }
        )
        self.group2.member_ids = [(4, user2.partner_id.id)]
        self.assertIn(user2.partner_id, self.group2.member_ids)
        # Verificar relación inversa
        self.assertIn(self.group2, user2.partner_id.group_ids)

    def test_empty_group_ids(self):
        """Test que un partner sin grupos tiene group_ids vacío."""
        partner = self.user.partner_id

        # Sin agregar a ningún grupo
        self.assertEqual(len(partner.group_ids), 0)
