from odoo import _, api, fields, models
from odoo.exceptions import UserError

HR_OFFICER_GROUP = "hr_holidays.group_hr_holidays_user"


class XenoLeaveAddApprover(models.TransientModel):
    _name = "xeno.leave.add.approver"
    _description = "Insert an extra approval step into a leave's chain"

    leave_id = fields.Many2one("hr.leave", required=True)
    employee_id = fields.Many2one(related="leave_id.employee_id", readonly=True)
    label = fields.Char(required=True, help="e.g. \"Department Head\"")
    approver_user_id = fields.Many2one(
        "res.users", string="Approver",
        help="Leave blank to allow any Time Off Officer/Administrator.")

    def action_add(self):
        self.ensure_one()
        if not self.env.user.has_group(HR_OFFICER_GROUP):
            raise UserError(_("Only Time Off Officers can add an approval step."))
        leave = self.leave_id
        if leave.state not in ("confirm", "validate1"):
            raise UserError(_(
                "This leave is no longer awaiting approval -- nothing to add a step to."))
        steps = leave.sudo().xeno_approval_step_ids.sorted("step_order")
        if not steps:
            raise UserError(_("This leave has no approval chain to add a step to."))
        last_step = steps[-1]
        insert_order = last_step.step_order
        last_step.step_order = insert_order + 1
        self.env["xeno.leave.approval.step"].sudo().create({
            "leave_id": leave.id,
            "step_order": insert_order,
            "label": self.label,
            "approver_user_id": self.approver_user_id.id,
        })
        leave.message_post(body=_(
            "%(user)s added an extra approval step: %(label)s (%(approver)s).",
            user=self.env.user.name, label=self.label,
            approver=self.approver_user_id.display_name or _("Any HR/Admin")))
        return {"type": "ir.actions.act_window_close"}
