from odoo import api, fields, models


class XenoEmployeeModuleAccess(models.Model):
    _name = "xeno.employee.module.access"
    _description = (
        "Per-employee individual module access override, mirrors XENHR's "
        "employee_module_access table / Employee Access tab. Only "
        "meaningful when no Employee Group tag already grants the same "
        "module -- group grant always wins (see hr.employee.category."
        "xeno_module_ids and hr.employee._xeno_has_module_access)."
    )
    _order = "employee_id, module_id"

    employee_id = fields.Many2one(
        "hr.employee", required=True, ondelete="cascade", index=True)
    module_id = fields.Many2one(
        "xeno.hr.module", string="Module", required=True, ondelete="cascade")
    enabled = fields.Boolean(default=False)
    enabled_by_id = fields.Many2one(
        "res.users", string="Set By", readonly=True, copy=False)
    granted_via_group = fields.Char(
        compute="_compute_granted_via_group",
        help="Employee Group tag(s) that already grant this module, if "
             "any -- informational, since group grant overrides this "
             "row's own enabled flag regardless of its value.")

    _employee_module_uniq = models.Constraint(
        "unique(employee_id, module_id)",
        "This employee already has an access row for this module.")

    @api.depends("employee_id.category_ids", "module_id")
    def _compute_granted_via_group(self):
        for rec in self:
            if not rec.employee_id or not rec.module_id:
                rec.granted_via_group = False
                continue
            tags = rec.employee_id.category_ids.filtered(
                lambda c: rec.module_id in c.xeno_module_ids)
            rec.granted_via_group = ", ".join(tags.mapped("name")) or False

    @api.model_create_multi
    def create(self, vals_list):
        for vals in vals_list:
            vals.setdefault("enabled_by_id", self.env.uid)
        return super().create(vals_list)
