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

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

from datetime import date


class ScopCotisation(models.AbstractModel):
    _name = "scop.cotisation"
    _description = "Base des cotisations"

    year = fields.Selection(
        [(year, str(year)) for year in range(
            fields.Datetime.now().year - 1, fields.Datetime.now().year + 2)],
        string='Année de cotisation',
        required=True)

    company_id = fields.Many2one(
        comodel_name='res.company',
        string='Company', change_default=True,
        required=True, readonly=True,
        default=lambda self: self.env.user.company_id)

    company_currency_id = fields.Many2one(
        comodel_name='res.currency', related='company_id.currency_id',
        string="Company Currency", readonly=True)
    payment_term_id = fields.Many2one(
        comodel_name='account.payment.term',
        string="Conditions de paiement",
        required=True
    )
    date_cotisation = fields.Date("Date de cotisation", required=True)

    member_count = fields.Integer(
        "Adhérents renouvelés",
        compute='_compute_member_count')
    new_member_count = fields.Integer(
        "Nouveaux adhérents",
        compute='_compute_new_member_count')
    invoiced_member_count = fields.Integer(
        "Cotisations créées",
        compute='_compute_invoiced_member_count')

    # ------------------------------------------------------
    # Compute fields
    # ------------------------------------------------------
    @api.multi
    def _compute_member_count(self):
        for cotiz in self:
            cotiz.member_count = len(cotiz.get_members())

    @api.multi
    def _compute_new_member_count(self):
        for cotiz in self:
            cotiz.new_member_count = len(cotiz.get_new_members())

    @api.multi
    def _compute_invoiced_member_count(self):
        for cotiz in self:
            cotiz.invoiced_member_count = len(
                cotiz.invoice_ids.mapped('partner_id'))

    # ------------------------------------------------------
    # Global functions
    # ------------------------------------------------------
    def create_contribution(self, product, partner, liasse=None, amount=0):
        Invoice = self.env['account.invoice']
        InvoiceLine = self.env['account.invoice.line']
        member_invoice = Invoice.create({
            'partner_id': partner.id,
            'liasse_fiscale_id': liasse.id,
            'type': 'out_invoice',
            'year': self.year,
            'is_contribution': True,
            'journal_id': self.company_id.contribution_journal_id.id,
            'state': 'draft',
            'account_id': partner.property_account_receivable_id.id,
            'payment_term_id': self.payment_term_id.id,
            'payment_mode_id': partner.customer_payment_mode_id.id,
            'date_invoice': self.date_cotisation,
        })

        # Création de la ligne CG Scop
        InvoiceLine.create({
            'invoice_id': member_invoice.id,
            'product_id': product.id,
            'account_id': product.property_account_income_id.id,
            'invoice_line_tax_ids': [(6, 0, product.taxes_id.ids)],
            'name': product.name,
            'price_unit': amount
        })

        return member_invoice

    @api.multi
    def get_members(self):
        self.ensure_one()
        members = self.env['scop.membership.period'].search([
            ('type_id', '=', self.env.ref(
                'cgscop_partner.membership_type_1').id),
            ('start', '<', date(self.year, 1, 1)),
            '|',
            ('end', '=', None),
            ('end', '>', date(self.year, 1, 1))
        ]).mapped('partner_id')
        return members

    @api.multi
    def get_new_members(self):
        self.ensure_one()
        members = self.env['scop.membership.period'].search([
            ('type_id', '=', self.env.ref(
                'cgscop_partner.membership_type_1').id),
            ('start', '>=', date(self.year, 1, 1)),
            ('start', '<=', date(self.year, 12, 31)),
            '|',
            ('end', '=', None),
            ('end', '>', date(self.year, 1, 1))
        ]).mapped('partner_id')
        return members