"""Stamp the affiliate referrer on a new user's partner at signup-time.

Reads the session/cookie populated by ``ir_http._dispatch`` and writes
``affiliate_referrer_config_id`` on the partner BEFORE the welcome email
fires, so the attribution survives across sessions and devices.
"""

from odoo import api, models
from odoo.http import request


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

    @api.model_create_multi
    def create(self, vals_list):
        users = super().create(vals_list)
        try:
            sess = request.session if request else None
        except Exception:
            sess = None
        config_id = sess and sess.get("affiliate_widget_config_id")
        if not config_id:
            return users
        config = (
            self.env["affiliate.widget.config"]
            .sudo()
            .browse(config_id)
            .exists()
        )
        if not config:
            return users
        for user in users:
            partner = user.partner_id
            # Don't overwrite an existing attribution.
            if partner and not partner.affiliate_referrer_config_id:
                partner.sudo().write({
                    "affiliate_referrer_config_id": config.id,
                })
        return users
