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

from datetime import datetime, timedelta
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError


class ScopPartner(models.Model):
    _inherit = "res.partner"

    def _default_ur(self):
        return self.env['res.company']._ur_default_get()

    # Infos générales
    is_cooperative = fields.Boolean("Est une coopérative")

    current_company_id = fields.Many2one(
        'res.company',
        string='Current company',
        compute='_compute_company_id')

    # Informations organisme
    # A garder ?
    id_ur = fields.Char("Identifiant unique SI UR")
    id_riga = fields.Char("Identifiant unique SI CG")

    # Informations Bandeau
    project_status = fields.Selection(
        [('1_information', "Phase d'information"),
         ('2_pre-diagnostic', 'Phase de pré-diagnostic'),
         ('3_accompagnement', "Phase d'accompagnement"),
         ('4_adhesion', "Phase d'adhésion"),
         ('5_suivi', 'Phase de suivi'),
         ('6_abandonne', 'Projet abandonné')],
        track_visibility='onchange',
        string='Statut projet')
    cooperative_form_id = fields.Many2one(
        'res.partner.cooperative.form',
        string="Cooperative form",
        on_delete='restrict')
    partner_company_type_id = fields.Many2one(
        comodel_name='res.partner.company.type',
        string='Legal Form',
        on_delete='restrict')
    membership_status = fields.Selection(
        [('member', 'Adhérent'),
         ('not_member', 'Non Adhérent'),
         ('out', 'Radié')],
        string="Statut d'adhésion", default="not_member")
    member_number = fields.Char("No adhérent")
    cae = fields.Boolean("CAE")

    # Infos générales / Contact
    admin_email = fields.Char('E-mail administratif')
    facebook = fields.Char("Facebook")
    linkedin = fields.Char("LinkedIn")
    twitter = fields.Char("Twitter")
    director_ids = fields.One2many(
        'res.partner', 'parent_id',
        string='Contacts Dirigeants')

    # Infos générales / Suivi UR
    ur_id = fields.Many2one(
        'union.regionale',
        string='Union Régionale',
        index=True,
        on_delete='restrict',
        default=_default_ur)
    creation_delegate_id = fields.Many2one(
        'res.partner',
        string='Délégué de création',
        domain=[('user_ids', '>', 0)],
        on_delete='restrict')
    followup_delegate_id = fields.Many2one(
        'res.partner',
        string='Délégué de suivi',
        domain=[('user_ids', '>', 0)],
        on_delete='restrict')
    parent_group_name = fields.Char('Coopérative mère')

    # Infos générales / Infos activité
    creation_origin_id = fields.Many2one(
        'res.partner.creation.origin',
        string="Origine création en coop",
        domain=[('parent_id', '=', False)],
        on_delete='restrict')
    creation_suborigin_id = fields.Many2one(
        'res.partner.creation.origin',
        string="Sous-Origine création en coop",
        domain=[('child_ids', '=', False)],
        on_delete='restrict')
    date_1st_sign = fields.Date(
        'Date 1er signature coop')
    registration_date = fields.Date(
        string="Date d'immatriculation RCS")
    social_object = fields.Text('Objet Social')
    naf_id = fields.Many2one(
        'res.partner.naf',
        string='Code NAF',
        on_delete='restrict')
    industry_id = fields.Many2one('res.partner.industry', 'Industry',
                                  on_delete='restrict')
    certification_ids = fields.Many2many(
        comodel_name='res.partner.certification',
        string='Agrément', on_delete='restrict')
    siret = fields.Char(string='SIRET', size=14)
    first_closeout = fields.Date(
        'Date clôture 1er bilan en coopérative')
    closeout_month = fields.Selection(
        [(12842, 'Janvier'),
         (12843, 'Février'),
         (12844, 'Mars'),
         (12845, 'Avril'),
         (12846, 'Mai'),
         (12847, 'Juin'),
         (12848, 'Juillet'),
         (12849, 'Août'),
         (12850, 'Septembre'),
         (12851, 'Octobre'),
         (12852, 'Novembre'),
         (12853, 'Décembre')],
        string='Mois clôture exercices', default=12853)
    is_seed_scop = fields.Boolean("Est une SCOP d'amorçage")
    seed_end = fields.Date("Date de fin du dispositif d'amorçage",
                           default=str(datetime.today() + timedelta(2556)),
                           compute='_compute_seen_end')
    is_incubated = fields.Boolean("Est incubé")
    incubator_id = fields.Many2one(
        'res.partner',
        string='Incubateur',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    prescriber_canal_id = fields.Many2one(
        'res.partner.prescriber.canal',
        string='Canal de Prescription',
        on_delete='restrict')

    # Infos juridiques
    siren = fields.Char(string='SIREN', size=9, compute='_compute_siren')
    dissolution_date = fields.Date('Date de Décès')
    dissolution_reason_id = fields.Many2one(
        'res.partner.dissolution.reason',
        string="Motif Décés",
        on_delete='restrict')

    # Partenaires
    bank_id = fields.Many2one(
        'res.partner',
        string='Banque principale',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    bank2_id = fields.Many2one(
        'res.partner',
        string='Banque secondaire',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    accountant_id = fields.Many2one(
        'res.partner',
        string='Expert-Comptable',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    accountant_person_id = fields.Many2one(
        'res.partner',
        string='Expert-Comptable (personne)',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    auditor_id = fields.Many2one(
        'res.partner',
        string='Commissaire aux Comptes',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    auditor_person_id = fields.Many2one(
        'res.partner',
        string='Commissaire aux Comptes (personne)',
        domain=[('is_company', '=', False)],
        on_delete='restrict')

    # Contacts / Adresses
    is_main_location = fields.Boolean("Est l'établissement principal")

    # Périodes juridiques
    scop_period_ids = fields.One2many(
        comodel_name='scop.period',
        inverse_name='partner_id',
        string="Périodes Juridiques")

    # Période d'adhésion
    membership_period_ids = fields.One2many(
        comodel_name='scop.membership.period',
        inverse_name='partner_id',
        string="Périodes d'adhésion")

    # Cotisation
    contribution_ids = fields.One2many(
        comodel_name='scop.contribution',
        inverse_name='partner_id',
        string='Cotisations')

    # Liste Ministère
    direccte_id = fields.Many2one(
        'res.partner',
        string='DIRECCTE rattachée',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    last_update_status = fields.Date('Dernière mise à jour des statuts')
    ministry_list_ids = fields.One2many(
        comodel_name='scop.ministry.list',
        inverse_name='partner_id',
        string='Liste Ministère')

    # Questionnaire
    questionnaire_ids = fields.One2many(
        comodel_name='scop.questionnaire',
        inverse_name='partner_id',
        string='Questionnaire')

    # Liasse fiscale
    liasse_fiscale_ids = fields.One2many(
        comodel_name='scop.liasse.fiscale',
        inverse_name='partner_id',
        string='Liasses Fiscales')

    # Révisions
    revision_contract = fields.Date("Date du contrat de révision")
    revision_company_id = fields.Many2one(
        'res.partner',
        string='Organisme de révision',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    revision_backup_company_id = fields.Many2one(
        'res.partner',
        string='Organisme de révision suppléant',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    revision_person_id = fields.Many2one(
        'res.partner',
        string='Réviseur',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    revision_certified_person_id = fields.Many2one(
        'res.partner',
        string='Réviseur agréé',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    revision_person_assign_date = fields.Date("Date de nomination du réviseur")
    revision_type = fields.Selection(
        [('1y', "Annuelle"),
         ('5y', 'Quinquennale'),
         ('5ys', "Quinquennale séquencée")],
        string='Périodicité de la révision')
    revision_format_id = fields.Many2one(
        'scop.revision.format',
        string='Format de révision',
        on_delete='restrict')
    revision_last_date = fields.Date("Dernier exercice révisé")
    revision_next_date = fields.Date("Prochain exercice révisable")
    revision_staff = fields.Integer(string='Effectif révision')

    revision_ids = fields.One2many(
        comodel_name='scop.revision',
        inverse_name='partner_id',
        string='Liste des Révisions')

    # Evènements juridiques
    legal_event_ids = fields.One2many(
        comodel_name='scop.legal.event',
        inverse_name='partner_id',
        string='Evènements Juridiques')

    # Outils financiers
    financial_tools_ids = fields.One2many(
        comodel_name='scop.financial.tools',
        inverse_name='partner_id',
        string='Outils financiers')

    # Champs pour personnes
    birthyear = fields.Integer("Année de naissance")
    education_level = fields.Selection([
        ('licence', 'Licence'),
        ('master', 'Master')],
        "Niveau d'étude")
    education_domain = fields.Selection([
        ('science', 'Science')],
        "Domaine d'étude")
    subscription_ids = fields.One2many(
        comodel_name='res.partner.newsletter.subscription',
        inverse_name='partner_id',
        string='Abonnements')
    contact_origin_id = fields.Many2one(
        'res.partner.rgpd.origin',
        string="Origine du contact",
        on_delete='restrict')
    contact_legality = fields.Selection(
        [("employee", "Salarié"),
         ("customer", "Client en contrat"),
         ("supplier", "Fournisseur en contrat"),
         ("consent", "Consentement"),
         ("legitimate", "Intérêt légitime"),
         ("none", "Aucune")],
        string="Licéité du contact", default="none")

    # Champs pour partenaires
    organization_type_id = fields.Many2one(
        'res.partner.organization.type',
        string="Type",
        domain=[('parent_id', '=', False)],
        on_delete='restrict')
    organization_subtype_id = fields.Many2one(
        'res.partner.organization.type',
        string="Sous-Type",
        domain=[('child_ids', '=', False)],
        on_delete='restrict')

    @api.multi
    def open_facebook(self):
        self.ensure_one()
        return {
            "type": "ir.actions.act_url",
            "url": self.facebook,
        }

    @api.multi
    def open_linkedin(self):
        self.ensure_one()
        return {
            "type": "ir.actions.act_url",
            "url": self.linkedin,
        }

    @api.multi
    def open_twitter(self):
        self.ensure_one()
        return {
            "type": "ir.actions.act_url",
            "url": self.twitter,
        }

    @api.onchange('creation_origin_id')
    def onchange_creation_origin_id(self):
        for coop in self:
            coop.creation_suborigin_id = False

    # Creation d'une periode lorsque le statut passe en Phase de Suivi 
    @api.onchange('project_status')
    def onchange_project_status(self):
        if self.project_status == '5_suivi':
            new_period = self.env['scop.period'].create({
                'partner_id': self._origin.id,
                'name': self.name,
                'cooperative_form_id': self.cooperative_form_id.id,
                'partner_company_type_id': self.partner_company_type_id.id,
                'siret': self.siret,
                'street': self.street,
                'street2': self.street2,
                'street3': self.street3,
                'zip': self.zip,
                'zip_id': self.zip_id.id,
                'city': self.city,
                'state_id': self.state_id.id,
                'country_id': self.country_id.id,
                'naf_id': self.naf_id.id,
                'industry_id': self.industry_id.id,
                'cae': self.cae,
                'parent_group_name': self.parent_group_name,
                'is_main_location': self.is_main_location
            })
            self.scop_period_ids = new_period

    @api.model
    def _compute_siren(self):
        for company in self:
            if company.siret:
                company.siren = company.siret[:9]

    @api.model
    def _compute_seen_end(self):
        for company in self:
            if company.date_1st_sign:
                company.seed_end = company.date_1st_sign + timedelta(2556)
            else:
                company.seed_end = str(datetime.today() + timedelta(2556))
    
    @api.model
    def _compute_company_id(self):
        for company in self:
            company.current_company_id = self.env['res.company'].browse(self.env.user.company_id.id)

    @api.multi
    def coop_open_act(self):
        ur_current = self.env.user.company_id.ur_id
        return {
            'name': _("Cooperative"),
            'type': 'ir.actions.act_window',
            'res_model': 'res.partner',
            'view_mode': 'tree,form',
            'view_type': 'form',
            'views': [[False, 'tree'], [False, 'form'], ],
            # 'context': {'search_default_company_id': [company_current.id]},
            'context': {'search_default_type_cooperative': True,
                        'search_default_ur_id': [ur_current.id],
                        'default_is_company': True,
                        'default_is_cooperative': True,
                        'default_company_type': 'company',
                        'default_project_status': '5_suivi'},
            'target': 'current',
        }

    # @api.multi
    # def action_deces(self):


class ScopPartnerCategory(models.Model):
    _inherit = "res.partner.category"

    def _default_ur(self):
        return self.env['res.company']._ur_default_get()

    id_riga = fields.Integer("ID RIGA")
    ur_id = fields.Many2one(
        'union.regionale',
        string='Union Régionale',
        index=True,
        on_delete='restrict',
        default=_default_ur)


class ResPartneCertification(models.Model):
    _name = "res.partner.certification"
    _description = "Certification"

    name = fields.Char('Certification')
    id_riga = fields.Integer("ID RIGA")
    color = fields.Integer('Couleur Index')


class ScopPartnerCompanyType(models.Model):
    _inherit = "res.partner.company.type"

    id_riga = fields.Integer("ID RIGA")


class ResPartnerCooperativeForm(models.Model):
    _name = "res.partner.cooperative.form"
    _description = "Cooperative form"

    name = fields.Char('Cooperative form')
    id_riga = fields.Integer("ID RIGA")


class ResPartnerCreationOrigin(models.Model):
    _name = "res.partner.creation.origin"
    _description = "Creation Origin"
    _parent_name = "parent_id"
    _parent_store = True
    _rec_name = 'name'
    _order = 'id'

    name = fields.Char('Origine / Sous-Origine', index=True, required=True)
    parent_id = fields.Many2one(
        comodel_name='res.partner.creation.origin',
        string='Origine (parent)',
        index=True,
        ondelete='restrict')
    parent_path = fields.Char(index=True)
    child_ids = fields.One2many(
        comodel_name='res.partner.creation.origin',
        inverse_name='parent_id',
        string='Sous origines')
    id_riga = fields.Integer("ID RIGA")

    @api.constrains('parent_id')
    def _check_origin_recursion(self):
        if not self._check_recursion():
            raise ValidationError(
                'Vous ne pouvez pas créer des origines récursives.')
        return True


class ResPartnerOrganizationType(models.Model):
    _name = "res.partner.organization.type"
    _description = "Type of Organization"
    _parent_name = "parent_id"
    _parent_store = True
    _rec_name = 'name'
    _order = 'id'

    name = fields.Char('Type / Sous-Type', index=True, required=True)
    parent_id = fields.Many2one(
        comodel_name='res.partner.organization.type',
        string='Type (parent)',
        index=True,
        ondelete='restrict')
    parent_path = fields.Char(index=True)
    child_ids = fields.One2many(
        comodel_name='res.partner.organization.type',
        inverse_name='parent_id',
        string='Sous types')
    id_riga = fields.Integer("ID RIGA")

    @api.constrains('parent_id')
    def _check_origin_recursion(self):
        if not self._check_recursion():
            raise ValidationError(
                'Vous ne pouvez pas créer des types récursifs.')
        return True


class ResPartnerDissolutionReason(models.Model):
    _name = "res.partner.dissolution.reason"
    _description = "Dissolution Reason"

    name = fields.Char('Dissolution Reason')


class ResPartnerPrescriberCanal(models.Model):
    _name = "res.partner.prescriber.canal"
    _description = "Prescriber Canal"

    name = fields.Char('Prescriber Canal')


class ResPartnerRgpdOrigin(models.Model):
    _name = "res.partner.rgpd.origin"
    _description = "Origin"

    name = fields.Char('Origin')