# © 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 ScopPeriodWizard(models.TransientModel):
    _name = "scop.period.wizard"
    _description = "Création d'une nouvelle période"

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

    @api.model
    def _default_previous_period_id(self):
        return (
            self.env["scop.period"]
            .search(
                [
                    ("partner_id", "=", self.env.context.get("active_id")),
                    ("end_reason", "=", False),
                ],
                limit=1,
            )
            .id
        )

    @api.model
    def _default_name(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).name

    @api.model
    def _default_cooperative_form_id(self):
        return (
            self.env["res.partner"]
            .browse(self.env.context.get("active_id"))
            .cooperative_form_id
        )

    @api.model
    def _default_partner_company_type_id(self):
        return (
            self.env["res.partner"]
            .browse(self.env.context.get("active_id"))
            .partner_company_type_id
        )

    @api.model
    def _default_siret(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).siret

    @api.model
    def _default_street(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).street

    @api.model
    def _default_street2(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).street2

    @api.model
    def _default_street3(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).street3

    @api.model
    def _default_zip(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).zip

    @api.model
    def _default_zip_id(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).zip_id

    @api.model
    def _default_city(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).city

    @api.model
    def _default_cedex(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).cedex

    @api.model
    def _default_state_id(self):
        return (
            self.env["res.partner"].browse(self.env.context.get("active_id")).state_id
        )

    @api.model
    def _default_country_id(self):
        return (
            self.env["res.partner"].browse(self.env.context.get("active_id")).country_id
        )

    @api.model
    def _default_naf_id(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).naf_id

    @api.model
    def _default_cae(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).cae

    @api.model
    def _default_ur_id(self):
        return self.env["res.partner"].browse(self.env.context.get("active_id")).ur_id

    # Fields common
    partner_id = fields.Integer("Partner", default=_default_partner_id)

    # Fields previous period
    previous_period_id = fields.Integer(default=_default_previous_period_id)
    end_reason = fields.Selection(
        [
            ("juri", "Modification de la forme juridique"),
            ("form", "Changement de forme coopérative"),
            ("acti", "Changement d'activité (NAF)"),
            ("adr", "Changement d'adresse"),
            ("nom", "Changement de dénomination sociale"),
            ("registration", "Immatriculation"),
            ("dreets", "Radiation DREETS"),
            ("autr", "Autres"),
        ],
        string="Motif",
    )
    comments = fields.Text("Commentaires")

    # Fields new period
    start = fields.Date("Début de validité", required=True, default=lambda self: fields.Date.today())
    name = fields.Char("Raison Sociale", required=True, default=_default_name)
    cooperative_form_id = fields.Many2one(
        "res.partner.cooperative.form",
        string="Cooperative form",
        ondelete="restrict",
        required=True,
        default=_default_cooperative_form_id,
    )
    partner_company_type_id = fields.Many2one(
        comodel_name="res.partner.company.type",
        string="Legal Form",
        ondelete="restrict",
        required=True,
        default=_default_partner_company_type_id,
    )
    siret = fields.Char(string="SIRET", size=14, required=True, default=_default_siret)
    street = fields.Char(default=_default_street)
    street2 = fields.Char(default=_default_street2)
    street3 = fields.Char(default=_default_street3)
    zip = fields.Char(default=_default_zip)
    zip_id = fields.Many2one("res.city.zip", "ZIP Location", default=_default_zip_id)
    city = fields.Char(default=_default_city)
    cedex = fields.Char(default=_default_cedex)
    state_id = fields.Many2one(
        "res.country.state",
        string="State",
        ondelete="restrict",
        domain="[('country_id', '=?', country_id)]",
        default=_default_state_id,
    )
    country_id = fields.Many2one(
        "res.country",
        string="Country",
        ondelete="restrict",
        default=_default_country_id,
    )
    naf_id = fields.Many2one(
        "res.partner.naf",
        string="Code NAF",
        ondelete="restrict",
        default=_default_naf_id,
    )
    cae = fields.Boolean("CAE", default=_default_cae)
    ur_id = fields.Many2one(
        comodel_name="union.regionale",
        string="Union Régionale",
        default=_default_ur_id,
    )

    # Action
    @api.onchange("zip_id")
    def _onchange_zip_id(self):
        if self.zip_id:
            self.zip = self.zip_id.name
            self.city = self.zip_id.city_id.name
            self.country_id = self.zip_id.city_id.country_id
            self.state_id = self.zip_id.city_id.state_id

    def create_period(self):
        for period in self:
            partner_values = {}
            # Close previous period
            previous_period = self.env["scop.period"].search(
                [("partner_id", "=", self.env.context.get("active_id"))],
                limit=1,
            )
            if previous_period:
                if previous_period.end:
                    if period.start >= previous_period.end:
                        partner_values = {
                            "dissolution_date": False,
                        }
                    else:
                        raise ValidationError(
                            "La nouvelle période ne peut commencer avant la "
                            + "fin de la période précédente : "
                            + str(previous_period.end)
                        )
                if period.start >= previous_period.start:
                    if not previous_period.end_reason:
                        previous_period.write(
                            {
                                "end": period.start,
                                "end_reason": period.end_reason,
                                "comments": period.comments,
                            }
                        )
                else:
                    raise ValidationError(
                        "La nouvelle période ne peut commencer avant la "
                        + "période précédente : "
                        + str(previous_period.start)
                    )

            # Create new period
            period_values = {
                "start": period.start,
                "partner_id": period.partner_id,
            }

            values = {
                "name": period.name,
                "dissolution_reason_id": False,
                "cooperative_form_id": period.cooperative_form_id.id,
                "partner_company_type_id": period.partner_company_type_id.id,
                "siret": period.siret,
                "street": period.street,
                "street2": period.street2,
                "street3": period.street3,
                "zip": period.zip,
                "zip_id": period.zip_id.id,
                "city": period.city,
                "cedex": period.cedex,
                "state_id": period.state_id.id,
                "country_id": period.country_id.id,
                "naf_id": period.naf_id.id,
                "cae": period.cae,
                "ur_id": period.ur_id.id,
            }
            period_values.update(values)
            self.env["scop.period"].with_context().create(period_values)

            # Update partner
            partner_values.update(values)

            partner = self.env["res.partner"].browse(period.partner_id)
            partner.sudo().write(partner_values)
            if period.siret and partner.is_registration_in_progress:
                partner.update({"is_registration_in_progress": False})