# -*- coding: utf-8 -*-
# Copyright (C) 2016-Today: La Louve (<http://www.lalouve.net/>)
# @author: La Louve
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html

from openerp import api, fields, models


class AccountInvoice(models.Model):
    _inherit = 'account.invoice'

    partner_owned_share_id = fields.Many2one('res.partner.owned.share',
                                             string="Partner Owned Share",
                                             readonly=True)

    @api.model
    def create(self, vals):
        '''
        Modify the function to:
            - Assign the Partner Own Share for invoice with category assigned
        '''
        res = super(AccountInvoice, self).create(vals)

        if vals.get('fundraising_category_id'):
            res.assign_ownshare_to_invoice()
        return res

    @api.multi
    def write(self, vals):
        '''
        Modify the function to:
            - Reassign the partner own share for invoice with partner or
            fundraising category changed (Fundraising transfer case)
        '''
        res = super(AccountInvoice, self).write(vals)
        if 'partner_id' in vals or 'fundraising_category_id' in vals:
            for invoice in self:
                invoice.assign_ownshare_to_invoice()
        return res

    @api.multi
    def assign_ownshare_to_invoice(self):
        '''
        @Function used for assigning an owned share record to invoices
        '''
        partner_owned_share_env = self.env['res.partner.owned.share']
        for invoice in self:
            fundraising_category = invoice.fundraising_category_id
            if not fundraising_category:
                continue

            # Search for existing partner owned share
            owned_share = partner_owned_share_env.sudo().search(
                [('partner_id', '=', invoice.partner_id.id),
                 ('category_id', '=', fundraising_category.id)],
                limit=1)

            # Create a new partner owned share if not exists
            if not owned_share:
                owned_share_vals = {
                    'partner_id': invoice.partner_id.id,
                    'category_id': fundraising_category.id,
                }
                owned_share = partner_owned_share_env.sudo().create(
                    owned_share_vals)

            invoice.partner_owned_share_id = owned_share.id

        return True