# Copyright 2018 Creu Blanca
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).


from odoo import SUPERUSER_ID, api, models
from odoo.exceptions import AccessDenied
from odoo.tools import config


class ResUsers(models.Model):
    _inherit = "res.users"

    @classmethod
    def _auth_check_remote(cls, credential, method):
        """Force a method to raise an AccessDenied on falsey return."""
        with cls.pool.cursor() as cr:
            env = api.Environment(cr, SUPERUSER_ID, {})
            remote = env["res.users"].remote
            if not config["test_enable"]:
                remote.ensure_one()
        result = method()
        if not result:
            # Force exception to record auth failure
            raise AccessDenied()
        return result

    # Override all auth-related core methods
    @classmethod
    def _login(cls, db, credential, user_agent_env):
        return cls._auth_check_remote(
            credential,
            lambda: super(ResUsers, cls)._login(db, credential, user_agent_env),
        )

    @classmethod
    def authenticate(cls, db, credential, user_agent_env):
        return cls._auth_check_remote(
            credential,
            lambda: super(ResUsers, cls).authenticate(db, credential, user_agent_env),
        )
