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

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


class CapitalCertificate(models.Model):
    _name = "capital.certificate"

    partner_id = fields.Many2one(
        'res.partner', string='Partner', required=True, ondelete='cascade')
    year = fields.Integer(string="Year", required=True)
    template_id = fields.Many2one(
        'mail.template', string='Email to Send', required=True,
        ondelete='restrict', help="""This field contains the template of the"""
        """ mail that will be automatically sent""")
    line_ids = fields.One2many(
        string="Certificate Lines", comodel_name="capital.certificate.line",
        inverse_name="certificate_id")

    @api.multi
    @api.constrains('partner_id', 'year')
    def _unique_partner_year(self):
        for certificate in self:
            if self.search_count([
                ('partner_id', '=', self.partner_id.id),
                ('year', '=', self.year),
            ]) > 1:
                raise ValidationError(_(
                    "Partner %s already has a certificate for year %s!" % (
                        certificate.partner_id.name, certificate.year)))

    @api.multi
    def create_certificate(self, send_mail=False):
        self.ensure_one()
        res_id = self.id
        template_id = self.template_id.id
        fields = [
            'subject', 'body_html', 'email_from', 'email_to', 'partner_to',
            'email_cc', 'reply_to', 'attachment_ids', 'mail_server_id']
        returned_fields = fields + ['partner_ids', 'attachments']
        template_values = self.env['mail.template'].with_context(
            tpl_partners_only=True).browse(template_id).generate_email(
            res_id, fields=fields)
        values = dict(
            (field, template_values[field])
            for field in returned_fields
            if template_values.get(field))
        values['body'] = values.pop('body_html', '')

        Attachment = self.env['ir.attachment']
        attachment_vals = self._prepare_attachment(values)
        attachment_ids = Attachment.create(attachment_vals)

        if send_mail:
            Mail = self.env['mail.mail']
            mail_vals = self._prepare_mail(values, attachment_ids)
            mail = Mail.create(mail_vals)
            mail.send()

    @api.multi
    def _prepare_attachment(self, values={}):
        self.ensure_one()
        return {
            'name': (self.partner_id.name + ' - ' + str(self.year) +
                     '.pdf').replace(',', ''),
            'datas_fname': (self.partner_id.name + ' - ' + str(self.year) +
                            '.pdf').replace(',', ''),
            'res_model': 'capital.certificate',
            'res_id': self.id,
            'mimetype': 'application/pdf',
            'index_content': 'application',
            'public': False,
            'datas': values['attachments'][0][1],
        }

    @api.multi
    def _prepare_mail(self, values={}, attachment_ids=None):
        self.ensure_one()
        email_to = ",".join([p.email for p in self.env['res.partner'].browse(
            values['partner_ids'])])
        return {
            'body_html': values['body'],
            'email_to': email_to,
            'recipient_ids': (0, 0, values['partner_ids']),
            'auto_delete': True,
            'subject': values['subject'],
            'model': 'capital.certificate',
            'res_id': self.id,
            'email_from': values['email_from'],
            'reply_to': values['reply_to'],
            'attachment_ids': [(6, 0, [a.id for a in attachment_ids])],
            'mail_server_id': self.env['ir.mail_server'].search([])[0].id
        }


class CapitalCertificateLine(models.Model):
    _name = "capital.certificate.line"

    account_move_line_id = fields.Many2one(
        string="Account Move Line", comodel_name="account.move.line")
    certificate_id = fields.Many2one(
        string="Certificate", comodel_name="capital.certificate")
    date = fields.Date("Invoice Date")
    payment_date = fields.Date("Payment Date")
    qty = fields.Integer("Quantity")
    product = fields.Char("Category")
    price = fields.Float("Unit Price")