from datetime import timedelta

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

HR_OFFICER_GROUP = "hr_holidays.group_hr_holidays_user"

_MONTH_NAMES = [
    "January", "February", "March", "April", "May", "June",
    "July", "August", "September", "October", "November", "December",
]
_MONTH_SELECTION = [(str(i + 1), name) for i, name in enumerate(_MONTH_NAMES)]


class XenoLeaveLateDeduct(models.TransientModel):
    _name = "xeno.leave.late.deduct"
    _description = "HR: process one month's late check-in leave deductions"

    year = fields.Integer(required=True, default=lambda self: self._default_prev_month()[0])
    month = fields.Selection(
        _MONTH_SELECTION, required=True,
        default=lambda self: str(self._default_prev_month()[1]))

    @api.model
    def _default_prev_month(self):
        today = fields.Date.context_today(self)
        prev = today.replace(day=1) - timedelta(days=1)
        return prev.year, prev.month

    def action_apply(self):
        self.ensure_one()
        if not self.env.user.has_group(HR_OFFICER_GROUP):
            raise UserError(_(
                "Only Time Off Officers can process late check-in deductions."))
        count, total_days = self.env["hr.leave"]._xeno_process_late_deductions(
            self.year, int(self.month))
        month_label = dict(_MONTH_SELECTION)[self.month]
        if count:
            message = _(
                "%(count)s employee(s) processed for %(month)s %(year)s -- "
                "%(days).2f day(s) deducted in total.",
                count=count, month=month_label, year=self.year, days=total_days)
        else:
            message = _(
                "No new deductions for %(month)s %(year)s -- nobody exceeded "
                "the monthly grace period, or this month was already processed.",
                month=month_label, year=self.year)
        return {
            "type": "ir.actions.client",
            "tag": "display_notification",
            "params": {
                "title": _("Late Check-in Deduction"),
                "message": message,
                "type": "success",
                "sticky": False,
            },
        }
