# © 2019 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from datetime import date

from dateutil.relativedelta import relativedelta

from odoo import api, fields, models


def get_years():
    year_list = []
    for i in range(2019, 2030):
        year_list.append((str(i), str(i)))
    return year_list


MONTHS = [
    ("1", "Janv"),
    ("2", "Fév"),
    ("3", "Mars"),
    ("4", "Avr"),
    ("5", "Mai"),
    ("6", "Juin"),
    ("7", "Juil"),
    ("8", "Août"),
    ("9", "Sept"),
    ("10", "Oct"),
    ("11", "Nov"),
    ("12", "Dec"),
]


class ScopMonthTimesheet(models.Model):
    _name = "ur.month.timesheet"
    _description = "Heures theoriques mensuelles"
    _order = "date_timesheet"

    def _default_ur(self):
        return self.env["res.company"]._ur_default_get()

    year = fields.Selection(
        selection=get_years(), string="Année", default=fields.Date.today().year
    )
    month = fields.Selection(selection=MONTHS, string="Mois")
    date_timesheet = fields.Date(
        string="Mois format date",
        compute="_compute_date_timesheet",
        store=True,
    )
    company_id = fields.Many2one(
        comodel_name="res.company",
        string="Société",
        default=lambda self: self.env.company,
    )
    ur_id = fields.Many2one(
        "union.regionale",
        string="Union Régionale",
        index=True,
        ondelete="restrict",
        default=_default_ur,
    )
    working_time = fields.Integer("Heures théoriques")

    _sql_constraints = [
        (
            "month_year_uniq",
            "UNIQUE (year, month, ur_id)",
            "Cette date a déjà été renseignée.",
        )
    ]

    @api.depends("year", "month")
    def _compute_date_timesheet(self):
        for month in self:
            date_timesheet = date(int(month.year), int(month.month), 1)
            month.date_timesheet = date_timesheet

    @api.model
    def get_month_values(self):
        today = date.today()
        first_date = today.replace(day=1) - relativedelta(months=6)
        last_date = today.replace(day=1) + relativedelta(months=6)
        values = self.search(
            [
                ("date_timesheet", ">=", first_date),
                ("date_timesheet", "<=", last_date),
                ("ur_id", "=", self.env.company.ur_id.id),
            ]
        )

        return {
            "month_values": values.mapped(
                lambda m: {
                    "year": m.year,
                    "month": self._fields["month"].selection[int(m.month) - 1][1],
                    "working_time": m.working_time,
                    "date_timesheet": m.date_timesheet,
                }
            ),
            "today": today.replace(day=1),
        }