# -*- coding: utf-8 -*-
# © 2019 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


class Training(models.Model):
    _name = 'training.training'
    _inherit = 'mail.thread'
    _rec_name = 'course_id'
    _order = 'date_begin desc'
    _description = 'Training for customers'

    customer_id = fields.Many2one(
        comodel_name='res.partner',
        string='Client',
        domain=[('is_company', '=', True)])
    opco_id = fields.Many2one(
        comodel_name='res.partner',
        string='OPCO',
        domain=[('is_company', '=', True), ('is_opco', '=', True)])
    student_ids = fields.One2many(
        comodel_name='training.student',
        inverse_name='training_id',
        string='Stagiaires',)
    session_ids = fields.One2many(
        comodel_name='training.session',
        inverse_name='training_id',
        string='Sessions',)
    course_id = fields.Many2one(
        comodel_name='training.course',
        string='Programme')
    type = fields.Selection(
        string='Type',
        required=True,
        selection=[('intra', 'INTRA'), ('inter', 'INTER')])
    agreement_number = fields.Char(
        string='Numéro Convention',
        required=True,
        copy=False,
        readonly=True,
        states={'draft': [('readonly', False)]},
        index=True,
        default='Brouillon')
    payment = fields.Boolean(string="Subrogation de paiement")
    date_begin = fields.Date(string='Début de la formation')
    date_end = fields.Date(string='Fin de la formation')
    session_hours = fields.Char(string='Horaires')
    students_nb_prev = fields.Char(string="Nb Stagiaires Prévisionnel")
    convention = fields.Binary(string="Convention")
    date_convention = fields.Date(string="Date Convention")
    date_attestation = fields.Date(string="Date Attestation")
    hours = fields.Integer(
        string='Durée (h)',
        compute='_compute_sessions',
        store=True)
    hours_total = fields.Integer(
        string="Nombre d'heures",
        compute='_compute_hours_total',
        store=True)
    session_count = fields.Integer(
        string="Nbre Sessions",
        compute='_compute_sessions',
        default=0,
        store=True)
    rate = fields.Integer(
        string="Taux horaire",
        compute='_compute_costs')
    students_count = fields.Integer(
        string='Nombre de stagiaires',
        compute='_compute_students_count',
        store=True,)
    cost = fields.Float(string='Prix de vente')
    student_cost = fields.Float(string='Prix / Stagiaire')
    amount = fields.Float(
        string='Commandé',
        compute='_compute_amount',
        store=True,)
    invoiced = fields.Float(
        string='Facturé',
        compute='_compute_invoiced',
        store=True,)
    order_ids = fields.One2many(
        comodel_name='sale.order',
        inverse_name='training_id',
        string='Commandes',)
    invoice_ids = fields.One2many(
        comodel_name='account.invoice',
        inverse_name='training_id',
        string='Factures',)
    state = fields.Selection(
        string='State',
        selection=[
            ('draft', 'Brouillon'),
            ('current', 'Accepté'),
            ('done', 'Réalisé')],
        default='draft')
    place = fields.Text(string='Lieu de la formation')
    company_id = fields.Many2one(
        comodel_name='res.company',
        string='Company',
        change_default=True,
        required=True,
        readonly=True,
        default=lambda self: self.env['res.company']._company_default_get())
    file_number = fields.Char(string='N° Dossier')
    plan = fields.Char(string='Dispositif')

    # ------------------------------------------------------
    # Override ORM
    # ------------------------------------------------------
    @api.model
    def create(self, vals):
        record = super(Training, self).create(vals)
        if vals.get('course_id', False):
            for s in record.course_id.session_ids:
                self.env['training.session'].create({
                    'session_id': s.id,
                    'training_id': record.id,
                    'date_delay': s.duration,
                    'sequence': s.sequence,
                })
        return record

    @api.multi
    def write(self, vals):
        record = super(Training, self).write(vals)
        if vals.get('course_id', False):
            self.session_ids.unlink()
            for s in self.course_id.session_ids:
                self.env['training.session'].create({
                    'session_id': s.id,
                    'training_id': self.id,
                    'date_delay': s.duration,
                    'sequence': s.sequence,
                })
        return record

    # ------------------------------------------------------
    # compute
    # ------------------------------------------------------
    @api.depends('student_ids')
    def _compute_students_count(self):
        self.students_count = len(self.student_ids)

    @api.depends('student_ids', 'cost')
    def _compute_costs(self):
        if self.students_count > 0:
            self.student_cost = self.cost / self.students_count
        if self.hours_total > 0:
            self.rate = self.cost / self.hours_total

    @api.depends('session_ids')
    def _compute_sessions(self):
        self.session_count = len(self.session_ids)
        self.hours = sum(self.session_ids.mapped('date_delay'))

    @api.depends('session_ids', 'student_ids')
    def _compute_hours_total(self):
        self.hours_total = self.students_count * self.hours

    @api.depends('order_ids')
    def _compute_amount(self):
        self.amount = sum(self.order_ids.mapped('amount_untaxed'))

    @api.depends('invoice_ids')
    def _compute_invoiced(self):
        self.invoiced = sum(self.invoice_ids.mapped('amount_untaxed_signed'))

    # ------------------------------------------------------
    # Buttons
    # ------------------------------------------------------
    @api.multi
    def action_valid(self):
        for training in self:
            training.state = 'current'
            training.agreement_number = self.env['ir.sequence'].next_by_code('training.training')

    @api.multi
    def action_done(self):
        for training in self:
            training.state = 'done'

    @api.multi
    def action_draft(self):
        for training in self:
            training.state = 'draft'

    @api.multi
    def _get_trainers(self):
        for training in self:
            trainers = training.session_ids.mapped('user_id')
            return trainers