# © 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 ScopMembershipOutWizard(models.TransientModel):
    _name = "scop.membership.out.wizard"
    _description = "Radiation"

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

    partner_id = fields.Many2one(
        comodel_name="res.partner", string="Partner", default=_default_partner_id
    )
    type_all = fields.Boolean(string="Tous types d'adhésion", default=True)
    type_id = fields.Many2one(
        "scop.membership.type", string="Type d'adhésion", ondelete="restrict"
    )
    end = fields.Date("Fin d'adhésion", required=True, default=lambda self: fields.Date.today())
    end_reason_id = fields.Many2one(
        "scop.membership.reason.end",
        string="Motif de fin d’adhésion",
        ondelete="restrict",
        required=True,
    )
    note = fields.Text("Commentaires")

    # ............................................................
    # Fermeture des périodes
    # ............................................................
    def member_out(self):
        for period in self:
            # On veut cloture toutes les périodes
            if period.type_all:
                last_periods = self.env["scop.membership.period"].search(
                    [
                        ("partner_id", "=", period.partner_id.id),
                        ("end", "=", False),
                    ]
                )
                for lp in last_periods:
                    period_type_id = lp.type_id.id
                    period.member_out_period(
                        period.partner_id.id,
                        period_type_id,
                        period.end,
                        period.end_reason_id.id,
                        period.note,
                    )
            # On ne veut cloturer qu'une seule période
            else:
                period_type_id = period.type_id.id
                period.member_out_period(
                    period.partner_id.id,
                    period_type_id,
                    period.end,
                    period.end_reason_id.id,
                    period.note,
                )
        self.partner_id.write({"membership_status": "out"})
        return

    # ............................................................
    # Fermeture d'une période
    # ............................................................
    def member_out_period(self, partner_id, period_type_id, end, end_reason_id, note):

        # Lecture de la dernière période active
        last_period = self.env["scop.membership.period"].search(
            [
                ("partner_id", "=", partner_id),
                ("end", "=", False),
                ("type_id", "=", period_type_id),
            ],
            limit=1,
        )
        if last_period:
            if end >= last_period.start:
                last_period.write(
                    {
                        "end": end,
                        "end_reason_id": end_reason_id,
                        "note": note,
                    }
                )
            else:
                raise ValidationError(
                    _(
                        "La date de fin doit être postèrieure à la date de "
                        + "début de la dernière période: "
                    )
                    + str(last_period.start)
                )
        else:
            raise ValidationError(
                _("Il n'existe pas de période avec ce type à fermer.")
            )

        return