class ConfiguracaoSim < ApplicationRecord
  has_paper_trail

  attr_accessor :tipo_poder, :tipo_pessoa

  belongs_to :agente_publico, class_name: 'Base::AgentePublicoMunicipal', foreign_key: 'agente_publico_id'
  belongs_to :pessoa, class_name: 'Base::Pessoa', foreign_key: 'pessoa_id'
  belongs_to :configuracao, class_name: 'Configuracao', foreign_key: 'configuracao_id'

  validates_presence_of :configuracao_id, :tipo_de_responsavel, :data_de_entrada
  validates_presence_of :crc, on: :create, if: Proc.new{ self.responsavel_registro_contabel? and self.pessoa.present? and self.pessoa.cpf? }

  validate :apenas_um_gestor_de_cada_tipo_ativo
  validate :data_entrada_em_ano_possivel, if: Proc.new{ self.data_de_entrada.present? }
  validate :data_saida_em_ano_possivel, if: Proc.new{ self.data_de_saida.present? }
  validate :valida_data_de_saida

  scope :gestores_responsaveis, -> { where('tipo_de_responsavel = ?', 1) }
  scope :responsaveis_pelos_registros, -> { where('tipo_de_responsavel = ?', 2) }
  scope :assessores_informatica, -> { where('tipo_de_responsavel = ?', 3) }

  enum tipo_de_responsavel: {
    gestor_responsavel: 1,
    responsavel_registro_contabel: 2,
    assessor_informatica: 3
  }

  enum tipo_sim: {
    executivo: 1,
    legislativo: 2
  }

  def apenas_um_gestor_de_cada_tipo_ativo
    gestor = self.tipo_de_responsavel
    if gestor == 'gestor_responsavel'
      if agente_publico_id_changed? && data_de_saida.blank? && configuracao.existe_responsavel_no_periodo_sem_tipo?(self.data_de_entrada, self.data_de_saida, self.tipo_de_responsavel, self.tipo_sim)
        errors.add(:data_de_saida, "Já possui um gestor ativo.")
      end
    elsif gestor == 'responsavel_registro_contabel'
      if self.pessoa.present?
        if pessoa_id_changed? && data_de_saida.blank? && configuracao.existe_responsavel_no_periodo_com_tipo?(self.data_de_entrada, self.data_de_saida, self.tipo_de_responsavel, self.pessoa.tipo_de_pessoa.try(:codigo), self.tipo_sim)
          errors.add(:data_de_saida, "Já possui um responsável ativo.")
        end
        if pessoa_id_changed? && self.crc.present? && data_de_saida.blank? && configuracao.existe_responsavel_no_periodo_com_tipo?(self.data_de_entrada, self.data_de_saida, self.tipo_de_responsavel, self.pessoa.tipo_de_pessoa.try(:codigo), self.tipo_sim)
          errors.add(:data_de_saida, "Já possui um responsável ativo.")
        end
      end
    elsif gestor == 'assessor_informatica'
      if self.pessoa.present?
        if pessoa_id_changed? && data_de_saida.blank? && configuracao.existe_responsavel_no_periodo_com_tipo?(self.data_de_entrada, self.data_de_saida, self.tipo_de_responsavel, self.pessoa.tipo_de_pessoa.try(:codigo), self.tipo_sim)
          errors.add(:data_de_saida, "Já possui um assessor ativo.")
        end
        if pessoa_id_changed? && data_de_saida.blank? && configuracao.existe_responsavel_no_periodo_com_tipo?(self.data_de_entrada, self.data_de_saida, self.tipo_de_responsavel, self.pessoa.tipo_de_pessoa.try(:codigo), self.tipo_sim)
          errors.add(:data_de_saida, "Já possui um assessor ativo.")
        end
      end
    end
	end

  def data_entrada_em_ano_possivel
    if self.data_de_entrada.year < 1990
      errors.add(:data_de_entrada, "Precisa ser a partir do ano 1990")
    end
  end

  def data_saida_em_ano_possivel
    if self.data_de_saida.year < 1990
      errors.add(:data_de_saida, "Precisa ser a partir do ano 1990")
    end
  end

  def valida_data_de_saida
    if self.data_de_saida.present? && self.data_de_entrada.present?
      errors.add(:data_de_saida, "não pode ser anterior ou igual a Data de Entrada.") if self.data_de_saida <= self.data_de_entrada
    end
  end

  def enviado_ao_sim?
		arquivo_id.present? && arquivo_id > 0
	end

  def to_sim
    begin
			gestor_responsavel = self.configuracao.gestor_responsavel_atual(self.tipo_sim).agente_publico
      responsavel_registro_contabil_PF = self.configuracao.responsavel_pelo_registro_contabel_atual_PF(self.tipo_sim)
      responsavel_registro_contabil_PJ = self.configuracao.responsavel_pelo_registro_contabel_atual_PJ(self.tipo_sim)
      assessor_informatica_PF = self.configuracao.assessor_informatica_atual_PF(self.tipo_sim).try(:pessoa)
      assessor_informatica_PJ = self.configuracao.assessor_informatica_atual_PJ(self.tipo_sim).try(:pessoa)
      crc_do_responsavel = responsavel_registro_contabil_PF.try(:crc).to_s
      crc_do_responsavel = crc_do_responsavel.length < 11 ? crc_do_responsavel.sim_preenche(11) : crc_do_responsavel.sim_limite(11)

			texto = ""
			texto << "999".to_s.sim_preenche(3) + "," #01
			texto << gestor_responsavel.try(:cpf).to_s.sim_limite(11) + "," #02
			texto << gestor_responsavel.try(:nome).to_s.sim_limite(40) + "," #03
			texto << gestor_responsavel.read_attribute_before_type_cast(:tipo_de_cargo).to_s.sim_preenche(2) + "," #04
			texto << responsavel_registro_contabil_PF.try(:pessoa).try(:cpf).to_s.sim_limite(11) + "," #05
			texto << crc_do_responsavel + "," #06
			texto << responsavel_registro_contabil_PF.try(:pessoa).try(:nome).to_s.sim_limite(40) + "," #07
			texto << responsavel_registro_contabil_PJ.try(:pessoa).try(:cnpj).to_s.sim_limite(25) + "," #08
			texto << responsavel_registro_contabil_PJ.try(:pessoa).try(:nome).sim_limite(60)+ "," #09
			texto << assessor_informatica_PF.try(:cpf).to_s.sim_limite(11)+ "," #10
			texto << assessor_informatica_PF.try(:nome).to_s.sim_limite(40)+ "," #11
			texto << assessor_informatica_PJ.try(:cnpj).to_s.sim_limite(25) + "," #12
			texto << assessor_informatica_PJ.try(:nome).to_s.sim_limite(60) #13

			return texto
		rescue => e
			if e.class.to_s == "NoMethodError"
				raise "Os Responsáveis para envio do SIM não estão cadastrados. Por favor, verifique os cadastros."
			else
				raise e
			end
		end
  end

end
