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

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


class ScopMembershipPeriodWizard(models.TransientModel):
    _name = "scop.membership.period.wizard"
    _description = "Création d'une nouvelle période d'adhésion"

    # Default functions
    @api.model
    def _default_partner_id(self):
        return self.env.context.get("active_id")

    @api.model
    def _default_number(self):
        partner_id = self.env["res.partner"].browse(self.env.context.get("active_id"))
        number = partner_id.member_number if partner_id.member_number else ""
        return number

    partner_id = fields.Integer("Partner", default=_default_partner_id)
    type_id = fields.Many2one(
        "scop.membership.type",
        string="Type d'adhésion",
        ondelete="restrict",
        required=True,
    )
    start = fields.Date("Début d’adhésion", required=True, default=lambda self: fields.Date.today())
    number = fields.Char("No adhérent", required=True, default=_default_number)
    note = fields.Text("Commentaires")

    def create_period(self):
        for period in self:
            # Raise validation error if previous period exists
            if self.env["scop.membership.period"].search(
                [
                    ("partner_id", "=", period.partner_id),
                    ("end", "=", False),
                    ("type_id", "=", period.type_id.id),
                ],
                limit=1,
            ):
                raise ValidationError(
                    _("Une période d'adhésion existe déjà pour ce type")
                )
            else:
                self.env["scop.membership.period"].create(
                    {
                        "partner_id": period.partner_id,
                        "type_id": period.type_id.id,
                        "start": period.start,
                        "number": period.number,
                        "note": period.note,
                    }
                )