# == Schema Information
#
# Table name: etablissements
#
#  id                                       :integer          not null, primary key
#  adresse                                  :string
#  association_date_creation                :date
#  association_date_declaration             :date
#  association_date_publication             :date
#  association_objet                        :text
#  association_rna                          :string
#  association_titre                        :string
#  code_insee_localite                      :string
#  code_postal                              :string
#  complement_adresse                       :string
#  diffusable_commercialement               :boolean
#  enseigne                                 :string
#  entreprise_bilans_bdf                    :jsonb
#  entreprise_bilans_bdf_monnaie            :string
#  entreprise_capital_social                :bigint
#  entreprise_code_effectif_entreprise      :string
#  entreprise_date_creation                 :date
#  entreprise_effectif_annee                :string
#  entreprise_effectif_annuel               :decimal(, )
#  entreprise_effectif_annuel_annee         :string
#  entreprise_effectif_mensuel              :decimal(, )
#  entreprise_effectif_mois                 :string
#  entreprise_forme_juridique               :string
#  entreprise_forme_juridique_code          :string
#  entreprise_nom                           :string
#  entreprise_nom_commercial                :string
#  entreprise_numero_tva_intracommunautaire :string
#  entreprise_prenom                        :string
#  entreprise_raison_sociale                :string
#  entreprise_siren                         :string
#  entreprise_siret_siege_social            :string
#  libelle_naf                              :string
#  localite                                 :string
#  naf                                      :string
#  nom_voie                                 :string
#  numero_voie                              :string
#  siege_social                             :boolean
#  siret                                    :string
#  type_voie                                :string
#  created_at                               :datetime
#  updated_at                               :datetime
#  dossier_id                               :integer
#
class Etablissement < ApplicationRecord
  belongs_to :dossier, optional: true

  has_one :champ, class_name: 'Champs::SiretChamp'
  has_many :exercices, dependent: :destroy

  has_one_attached :entreprise_attestation_sociale
  has_one_attached :entreprise_attestation_fiscale

  accepts_nested_attributes_for :exercices

  validates :siret, presence: true
  validates :dossier_id, uniqueness: { allow_nil: true }

  def search_terms
    [
      entreprise_siren,
      entreprise_numero_tva_intracommunautaire,
      entreprise_forme_juridique,
      entreprise_forme_juridique_code,
      entreprise_nom_commercial,
      entreprise_raison_sociale,
      entreprise_siret_siege_social,
      entreprise_nom,
      entreprise_prenom,
      association_rna,
      association_titre,
      association_objet,
      siret,
      enseigne,
      naf,
      libelle_naf,
      adresse,
      code_postal,
      localite,
      code_insee_localite
    ]
  end

  def spreadsheet_columns
    [
      ['Dossier ID', :dossier_id_for_export],
      ['Champ', :libelle_for_export],
      ['Établissement SIRET', :siret],
      ['Etablissement enseigne', :enseigne],
      ['Établissement siège social', :siege_social],
      ['Établissement NAF', :naf],
      ['Établissement libellé NAF', :libelle_naf],
      ['Établissement Adresse', :adresse],
      ['Établissement numero voie', :numero_voie],
      ['Établissement type voie', :type_voie],
      ['Établissement nom voie', :nom_voie],
      ['Établissement complément adresse', :complement_adresse],
      ['Établissement code postal', :code_postal],
      ['Établissement localité', :localite],
      ['Établissement code INSEE localité', :code_insee_localite],
      ['Entreprise SIREN', :entreprise_siren],
      ['Entreprise capital social', :entreprise_capital_social],
      ['Entreprise numero TVA intracommunautaire', :entreprise_numero_tva_intracommunautaire],
      ['Entreprise forme juridique', :entreprise_forme_juridique],
      ['Entreprise forme juridique code', :entreprise_forme_juridique_code],
      ['Entreprise nom commercial', :entreprise_nom_commercial],
      ['Entreprise raison sociale', :entreprise_raison_sociale],
      ['Entreprise SIRET siège social', :entreprise_siret_siege_social],
      ['Entreprise code effectif entreprise', :entreprise_code_effectif_entreprise],
      ['Entreprise date de création', :entreprise_date_creation],
      ['Entreprise nom', :entreprise_nom],
      ['Entreprise prénom', :entreprise_prenom],
      ['Association RNA', :association_rna],
      ['Association titre', :association_titre],
      ['Association objet', :association_objet],
      ['Association date de création', :association_date_creation],
      ['Association date de déclaration', :association_date_declaration],
      ['Association date de publication', :association_date_publication]
    ]
  end

  def siren
    entreprise_siren
  end

  def geo_adresse
    [numero_voie, type_voie, nom_voie, complement_adresse, code_postal, localite].join(' ')
  end

  def inline_adresse
    # squeeze needed because of space in excess in the data
    [
      "#{numero_voie} #{type_voie} #{nom_voie}",
      complement_adresse,
      "#{code_postal} #{localite}"
    ].reject(&:blank?).join(', ').squeeze(' ')
  end

  def association?
    association_rna.present?
  end

  def entreprise
    Entreprise.new(
      etablissement: self,
      siren: entreprise_siren,
      capital_social: entreprise_capital_social,
      numero_tva_intracommunautaire: entreprise_numero_tva_intracommunautaire,
      forme_juridique: entreprise_forme_juridique,
      forme_juridique_code: entreprise_forme_juridique_code,
      nom_commercial: entreprise_nom_commercial,
      raison_sociale: entreprise_raison_sociale,
      siret_siege_social: entreprise_siret_siege_social,
      code_effectif_entreprise: entreprise_code_effectif_entreprise,
      effectif_mensuel: entreprise_effectif_mensuel,
      effectif_mois: entreprise_effectif_mois,
      effectif_annee: entreprise_effectif_annee,
      effectif_annuel: entreprise_effectif_annuel,
      effectif_annuel_annee: entreprise_effectif_annuel_annee,
      date_creation: entreprise_date_creation,
      nom: entreprise_nom,
      prenom: entreprise_prenom,
      inline_adresse: inline_adresse
    )
  end

  def upload_attestation(url, attestation)
    filename = File.basename(URI.parse(url).path)
    response = Typhoeus.get(url)

    if response.success?
      attestation.attach(
        io: StringIO.new(response.body),
        filename: filename,
        # we don't want to run virus scanner on this file
        metadata: { virus_scan_result: ActiveStorage::VirusScanner::SAFE }
      )
    end
  end

  def upload_attestation_sociale(url)
    upload_attestation(url, entreprise_attestation_sociale)
  end

  def upload_attestation_fiscale(url)
    upload_attestation(url, entreprise_attestation_fiscale)
  end

  def entreprise_date_arret_exercice
    entreprise_last_bilan_info_cle("date_arret_exercice")
  end

  def entreprise_resultat_exercice
    entreprise_last_bilan_info_cle("resultat_exercice")
  end

  def entreprise_excedent_brut_exploitation
    entreprise_last_bilan_info_cle("excedent_brut_exploitation")
  end

  def entreprise_fdr_net_global
    entreprise_last_bilan_info_cle("fonds_roulement_net_global")
  end

  def entreprise_besoin_fdr
    entreprise_last_bilan_info_cle("besoin_en_fonds_de_roulement")
  end

  def entreprise_bilans_bdf_to_sheet(format)
    SpreadsheetArchitect.send("to_#{format}".to_sym, bilans_bdf_data)
  end

  private

  def bilans_new_keys
    keys = entreprise_bilans_bdf.flat_map(&:keys).uniq
    keys - bilans_headers
  end

  def entreprise_last_bilan_info_cle(key)
    entreprise_bilans_bdf.first[key]
  end

  def bilans_bdf_data
    headers = bilans_headers.concat(bilans_new_keys)
    data = entreprise_bilans_bdf.map do |bilan|
      headers.map { |h| bilan[h] }
    end
    { headers: headers, data: data }
  end

  def dossier_id_for_export
    if dossier_id
      dossier_id.to_s
    elsif champ
      champ.dossier_id.to_s
    end
  end

  def libelle_for_export
    champ&.libelle || 'Dossier'
  end

  def bilans_headers
    [
      "date_arret_exercice", "duree_exercice", "chiffre_affaires_ht", "evolution_chiffre_affaires_ht",
      "valeur_ajoutee_bdf", "evolution_valeur_ajoutee_bdf", "excedent_brut_exploitation",
      "evolution_excedent_brut_exploitation", "resultat_exercice", "evolution_resultat_exercice",
      "capacite_autofinancement", "evolution_capacite_autofinancement", "fonds_roulement_net_global",
      "evolution_fonds_roulement_net_global", "besoin_en_fonds_de_roulement", "evolution_besoin_en_fonds_de_roulement",
      "ratio_fonds_roulement_net_global_sur_besoin_en_fonds_de_roulement",
      "evolution_ratio_fonds_roulement_net_global_sur_besoin_en_fonds_de_roulement", "disponibilites",
      "evolution_disponibilites", "capital_social_inclus_dans_capitaux_propres_et_assimiles",
      "evolution_capital_social_inclus_dans_capitaux_propres_et_assimiles", "capitaux_propres_et_assimiles",
      "evolution_capitaux_propres_et_assimiles", "autres_fonds_propres", "evolution_autres_fonds_propres",
      "total_provisions_pour_risques_et_charges", "evolution_total_provisions_pour_risques_et_charges",
      "dettes1_emprunts_obligataires_et_convertibles", "evolution_dettes1_emprunts_obligataires_et_convertibles",
      "dettes2_autres_emprunts_obligataires", "evolution_dettes2_autres_emprunts_obligataires",
      "dettes3_emprunts_et_dettes_aupres_des_etablissements_de_credit",
      "evolution_dettes3_emprunts_et_dettes_aupres_des_etablissements_de_credit",
      "dettes4_maturite_a_un_an_au_plus", "evolution_dettes4_maturite_a_un_an_au_plus",
      "emprunts_et_dettes_financieres_divers", "evolution_emprunts_et_dettes_financieres_divers",
      "total_dettes_stables", "evolution_total_dettes_stables", "groupes_et_associes",
      "evolution_groupes_et_associes", "total_passif", "evolution_total_passif"
    ]
  end
end