# © 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


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

    def _default_company(self):
        return self.env['res.company']._company_default_get('res.partner')

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

    # Informations organisme
    # A garder ?
    unique_id_si_ur = fields.Char("Identifiant unique SI UR")
    unique_id_si_cg = fields.Char("Identifiant unique SI CG")
    company_id = fields.Many2one(
        'res.company',
        string='Union Régionale',
        index=True,
        on_delete='restrict',
        default=_default_company)
    siren = fields.Char(string='SIREN', size=9)
    registration_date = fields.Date(
        string="Date d'immatriculation RCS")
    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')
    organization_type_id = fields.Many2one(
        'res.partner.organization.type',
        string="Type d'organisme",
        on_delete='restrict')
    sigle = fields.Char('Sigle')
    social_object = fields.Char('Objet Social')

    admin_email = fields.Char('E-mail administratif')

    # Informations coopératives
    creation_origin = fields.Selection(
        [('null', 'Ex-nihilo'),
         ('transformation', 'Transformation'),
         ('transmission', 'Transmission'),
         ('takeover', 'reprise')],
        string='Origine création en coop')
    creation_suborigin_id = fields.Many2one(
        'res.partner.creation.suborigin',
        string="Sous-Origine création en coop",
        on_delete='restrict')
    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')
    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')
    origin_company_type_id = fields.Many2one(
        comodel_name='res.partner.company.type',
        string="Forme juridique d'origine",
        track_visibility='onchange',
        on_delete='restrict')
    bank_id = fields.Many2one(
        'res.partner',
        string='Banquier principal',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    bank2_id = fields.Many2one(
        'res.partner',
        string='Banquier secondaire',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    direccte_id = fields.Many2one(
        'res.partner',
        string='DIRECCTE rattachée',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    date_1st_sign = fields.Date(
        'Date 1er signature coop')
    last_update_status = fields.Date('Dernière mise à jour des statuts')
    auditor_id = fields.Many2one(
        'res.partner',
        string='Commissaire aux Comptes',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    accountant_id = fields.Many2one(
        'res.partner',
        string='Expert-Comptable',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    is_seed_scop = fields.Boolean("Est une SCOP d'amorçage")
    seed_end = fields.Date("Date de fin de dispositif",
                           default=str(datetime.today() + timedelta(2556)))
    auditor_person_id = fields.Many2one(
        'res.partner',
        string='Commissaire aux Comptes (personne)',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    accountant_person_id = fields.Many2one(
        'res.partner',
        string='Expert-Comptable (personne)',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    is_incubated = fields.Boolean("Est incubé")
    incubator_id = fields.Many2one(
        'res.partner',
        string='Incubateur',
        domain=[('is_company', '=', True)],
        on_delete='restrict')
    prescriber_id = fields.Many2one(
        'res.partner',
        string='Prescripteur',
        domain=[('is_company', '=', True)],
        on_delete='restrict')

    # Informations de révision
    revision_contract = fields.Boolean("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 agréé',
        domain=[('is_company', '=', False)],
        on_delete='restrict')
    revision_backup_person_id = fields.Many2one(
        'res.partner',
        string='Réviseur assistant',
        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='Nature de la révision')
    revision_format_id = fields.Many2one(
        'scop.revision.format',
        string='Format de révision',
        on_delete='restrict')
    revision_staff_id = fields.Many2one(
        'scop.revision.staff',
        string='Effectif révision',
        on_delete='restrict')
    revision_next_date = fields.Date("Prochain exercice révisable")

    # Informations fiscales/financières
    first_closeout = fields.Date(
        'Date clôture 1er bilan')
    closeout_month = fields.Selection(
        [(1, 'Janvier'),
         (2, 'Février'),
         (3, 'Mars'),
         (4, 'Avril'),
         (5, 'Mai'),
         (6, 'Juin'),
         (7, 'Juillet'),
         (8, 'Août'),
         (9, 'Septembre'),
         (10, 'Octobre'),
         (11, 'Novembre'),
         (12, 'Décembre')],
        string='Mois clôture exercices', default=12)

    # Infos suivies
    # Infos organismes
    cooperative_form_id = fields.Many2one(
        'res.partner.cooperative.form',
        string="Cooperative form",
        track_visibility='onchange',
        on_delete='restrict')
    cae = fields.Boolean("CAE", track_visibility='onchange')
    siret = fields.Char(string='SIRET', size=14, track_visibility='onchange')
    name = fields.Char(index=True, track_visibility='always')
    street = fields.Char(track_visibility='onchange')
    street2 = fields.Char(track_visibility='onchange')
    street3 = fields.Char(track_visibility='onchange')
    zip_id = fields.Many2one('res.city.zip', 'ZIP Location',
                             track_visibility='onchange')
    city = fields.Char(track_visibility='onchange')
    city_id = fields.Many2one('res.city', string='City of Address',
                              track_visibility='onchange')
    state_id = fields.Many2one(
        "res.country.state",
        string='State',
        ondelete='restrict',
        domain="[('country_id', '=?', country_id)]",
        track_visibility='onchange')
    country_id = fields.Many2one(
        'res.country', string='Country', ondelete='restrict',
        track_visibility='onchange')
    is_main_location = fields.Boolean("Est l'établissement principal",
                                      track_visibility='onchange')
    is_subsidiary = fields.Boolean('Est une Filiale',
                                   track_visibility='onchange')
    parent_group_name = fields.Char('Nom du groupe parent',
                                    track_visibility='onchange')

    # Informations juridiques
    partner_company_type_id = fields.Many2one(
        comodel_name='res.partner.company.type',
        string='Legal Form',
        track_visibility='onchange',
        on_delete='restrict'
    )
    capital = fields.Integer('Capital social', track_visibility='onchange')
    ape_id = fields.Many2one(
        'res.partner.category',
        string='APE',
        help="If the partner is a French company, enter its official "
        "main activity in this field. The APE is chosen among the "
        "NAF nomenclature.",
        track_visibility='onchange',
        on_delete='restrict'
    )
    certification_ids = fields.Many2many(
        comodel_name='res.partner.certification',
        string='Agrement', track_visibility='onchange',
        on_delete='restrict')
    industry_id = fields.Many2one('res.partner.industry', 'Industry',
                                  track_visibility='onchange',
                                  on_delete='restrict')

    # Autres Informations
    # 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
    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')

    # Effectifs
    staff_ids = fields.One2many(
        comodel_name='scop.staff',
        inverse_name='partner_id',
        string='Effectifs')

    # Révisions
    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 contacts
    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")


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

    name = fields.Char('Dissolution Reason')


class ResPartnerTypeOrganization(models.Model):
    _name = "res.partner.organization.type"
    _description = "Organization Type"

    name = fields.Char('Organization Type')


class ResPartnerCreationSuborigin(models.Model):
    _name = "res.partner.creation.suborigin"
    _description = "Creation Sub-Origin"

    name = fields.Char('Creation Sub-Origin')


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

    name = fields.Char('Cooperative form')


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

    name = fields.Char('Certification')


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

    name = fields.Char('Origin')