require 'active_support/concern'

module MensagemConcern
	extend ActiveSupport::Concern

	# ITEM DO PEDIDO POR PESSOA
	def cria_mensagem_cotacao_externa
		unless pessoa_do_pedido.interno
			titulo	 =  I18n.t('titulos.cotacao_externa',
				empresa_nome: pessoa_do_pedido.empresa_nome,
				pedido_numero: item_do_pedido.pedido.numero
			)
			conteudo = titulo	 =  I18n.t('mensagens.cotacao_externa',
				url_aplicacao: url_aplicacao, pedido_id: item_do_pedido.pedido_id
			)
			usuarios = Usuario.joins(:perfil).where(perfis: { nome: "Setor de Compras" }).to_a
			enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
		end
	end

	#PEDIDO
	def cria_mensagem_setor_compras
		titulo = I18n.t('titulos.setor_de_compras_pedido_enviado_para_cotacao_de_preco', numero: numero)
		conteudo = I18n.t(
			'mensagens.setor_de_compras_pedido_enviado_para_cotacao_de_preco',
			url_aplicacao: url_aplicacao, id: id
		)
		usuarios = Perfil.includes(:usuarios).find_by_nome("Setor de Compras").try(:usuarios).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_unidades_convidadas
		unidades_orcamentarias_ids = unidades_convidadas.pluck(:unidade_orcamentaria_id)
		Loa::UnidadeOrcamentaria.where(id: unidades_orcamentarias_ids).each do |unidade_orcamentaria|
			titulo = I18n.t('titulos.unidades_convidadas',
				unidade_orcamentaria_nome: unidade_orcamentaria.nome
			)
			conteudo = I18n.t('mensagens.unidades_convidadas',
				unidade_orcamentaria_nome: unidade_orcamentaria.nome, objeto: objeto,
				data_limite_para_complementacao: data_limite_para_complementacao,
				url_aplicacao: url_aplicacao, id: id
			)
			usuarios = unidade_orcamentaria.usuarios.to_a
			enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
		end
	end

	def cria_mensagem_pedido_fechado
		titulo 	 = I18n.t('titulos.pedido_retornou_da_cotacao_de_preco', numero: numero)
		conteudo = I18n.t('mensagens.pedido_retornou_da_cotacao_de_preco', url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.usuarios_por_unidade_orcamentaria(unidade_orcamentaria_id).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_complementacao_pedido(unidade_id)
		unidade_convidada = Loa::UnidadeOrcamentaria.find(unidade_id)
		titulo =  I18n.t(
			'titulos.complementacao_de_pedido_pela_unidade',
			unidade_convidada_nome: unidade_convidada.nome, numero: numero
		)

		conteudo =  I18n.t(
			'mensagens.complementacao_de_pedido_pela_unidade',
			numero: numero, url_aplicacao: url_aplicacao, id: id
		)
		usuarios = Usuario.usuarios_por_unidade_orcamentaria(unidade_orcamentaria_id).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	#PROJETO
	def cria_mensagem_de_projeto_encaminhado
		titulo = I18n.t('titulos.setor_licitacao_novo_projeto')
		conteudo = I18n.t('mensagens.setor_licitacao_novo_projeto',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Set.new
		self.unidades_orcamentarias.each do |unidade_orcamentaria|
			unidade_orcamentaria.usuarios.each do |usuario|
				usuarios << usuario
			end
		end
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
	end

	def cria_mensagem_unidade_principal
		titulo = I18n.t('titulos.unidade_principal_sessao_processo_concluido', numero_do_processo: numero_do_processo)
		conteudo = I18n.t(
			'mensagens.unidade_principal_sessao_processo_concluido',
			url_aplicacao: url_aplicacao, id: id
		)
		usuarios = Usuario.usuarios_por_unidade_orcamentaria(pedido.unidade_orcamentaria_id).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_envia_projeto_para_controladoria
		titulo = I18n.t('titulos.envia_projeto_para_controladoria', numero: pedido.try(:numero))
		conteudo = I18n.t('mensagens.envia_projeto_para_controladoria',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.joins(:perfil).where(perfis: { nome: 'Comissão de Licitação'}).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_retorno_projeto_da_controladoria
		titulo = I18n.t('titulos.retorno_projeto_da_controladoria', numero: pedido.try(:numero))
		conteudo = I18n.t('mensagens.retorno_projeto_da_controladoria',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.joins(:perfil).where(perfis: { nome: 'Comissão de Licitação'}).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_projeto_autorizado
		titulo = I18n.t('titulos.projeto_autorizado', numero: pedido.try(:numero))
		conteudo = I18n.t('mensagens.projeto_autorizado',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.joins(:perfil).where(perfis: { nome: 'Comissão de Licitação'}).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_envia_projeto_para_parecer
		titulo = I18n.t('titulos.envia_projeto_para_parecer', numero: pedido.try(:numero))
		conteudo = I18n.t('mensagens.envia_projeto_para_parecer',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.joins(:perfil).where(perfis: { nome: 'Procuradoria'}).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_parecer_concluido
		titulo = I18n.t('titulos.parecer_concluido', numero_do_processo: self.try(:numero_do_processo))
		conteudo = I18n.t('mensagens.parecer_concluido', url_aplicacao: url_aplicacao, id: self.id.to_s)
		usuarios = Usuario.joins(:perfil).where('perfis.nome = ? or perfis.nome = ?', 'Comissão de Licitação', 'Setor Administrativo').to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_enviado_ao_planejamento
		titulo = I18n.t('titulos.enviado_ao_planejamento', texto: "Projeto", id: Licitacao::Projeto.find(projeto_id).pedido.numero) if projeto_id.present? && !empenho_id.present?
		titulo = I18n.t('titulos.enviado_ao_planejamento', texto: "Empenho", id: Contabilidade::Empenho.find(empenho_id).numero_do_empenho) if empenho_id.present?
		conteudo = I18n.t('mensagens.enviado_ao_planejamento',	url_aplicacao: url_aplicacao, id: id)
		usuarios = Usuario.joins(:perfil).where(perfis: { nome: 'Contabilidade'}).to_a
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
		Comunicacao::Mensagem.create(
			titulo: titulo,
			conteudo: conteudo,
			usuarios: usuarios
		)
	end

	def enviar_mensagem_para_email(titulo, conteudo, email)
		Comunicacao::Mensagem.create(
			titulo: titulo,
			conteudo: conteudo,
			email: email
		)
	end

	def url_aplicacao
		municipio = ENV["municipio"].blank? ? "" : "/#{ENV['municipio']}"
		host = ENV["host"].blank? ? "" : "#{ENV['host']}"
		host + municipio
	end

	#novos
	def fechamento_de_contrato contrato
		unless contrato.rescindido?
			titulo = I18n.t('titulos.fechamento_de_contrato',
				numero_do_contrato: contrato.numero,
				nome_do_fornecedor: contrato.pessoa_do_projeto.empresa_nome
			)
			conteudo = I18n.t('mensagens.fechamento_de_contrato',
				numero_do_contrato: contrato.try(:numero),
				nome_da_unidade_orcamentaria: contrato.try(:unidade_orcamentaria).try(:nome),
				nome_do_fornecedor: contrato.try(:pessoa_do_projeto).try(:empresa_nome),
				fim_da_vigencia: contrato.try(:data_final_de_acordo_com_aditivos),
				dias_ate_final_da_vigencia: contrato.try(:tempo_restante),
				url_aplicacao: url_aplicacao,
				contrato_id: contrato.try(:id)
			)

			usuarios = contrato.unidade_orcamentaria.usuarios
			enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
		end
	end

	def cria_mensagem_ata_confirmada ata
		titulo = I18n.t( 'titulos.ata_confirmada', numero_da_ata: ata.try(:numero) )
		conteudo = I18n.t('mensagens.ata_confirmada', numero_da_ata: ata.try(:numero), data_final: ata.try(:data_final_de_vigencia), tempo_restante: ata.try(:tempo_restante), url_aplicacao: url_aplicacao, ata_id: ata.try(:id) )
		usuarios = Set.new
		ata.unidades_orcamentarias.each do |unidade_orcamentaria|
			unidade_orcamentaria.usuarios.each do |usuario|
				usuarios << usuario
			end
		end
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
	end

	def cria_mensagem_empenho_confirmado
		if Configuracao.first.envia_empenho_para_contabilidade?
			titulo = I18n.t('titulos.empenho_confirmado', numero_do_empenho: self.try(:numero_do_empenho), unidade_orcamentaria: self.unidade_orcamentaria.try(:nome) )
			conteudo = I18n.t('mensagens.empenho_confirmado', numero_do_empenho: self.try(:numero_do_empenho), valor_contratado: self.try(:definir_valor_do_empenho).to_f.try(:real_contabil), nome_do_fornecedor: self.try(:pessoa).try(:nome), id_empenho: self.try(:id), url_aplicacao: url_aplicacao)
			usuarios = self.unidade_orcamentaria.usuarios
			enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
		end
	end

	def cria_mensagem_liquidacao_confirmada
		if Configuracao.first.envia_liquidacao_para_contabilidade?
			titulo = I18n.t('titulos.liquidacao_confirmada', numero_da_liquidacao: self.numero, numero_do_empenho_e_fornecedor: self.empenho.numero_e_fornecedor)
			if self.nota_fiscal.blank?
				nota_fiscal = "SEM NOTA FISCAL"
			else
				nota_fiscal = "#{self.nota_fiscal.numero_da_nota}"
			end
			conteudo = I18n.t('mensagens.liquidacao_confirmada', id_liquidacao: self.id, numero_da_liquidacao: self.numero, numero_do_empenho: self.empenho.numero_do_empenho , nome_do_fornecedor: self.empenho.pessoa.nome, unidade_orcamentaria: self.unidade_orcamentaria.nome, nota_fiscal: nota_fiscal, url_aplicacao: url_aplicacao)
			usuarios = self.unidade_orcamentaria.usuarios
			enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
		end
	end

	def cria_mensagem_parecer_da_procuradoria
		if(self.aprovado?)
			status_do_parecer = "positivo"
		else
			status_do_parecer = "negativo"
		end

		if self.vistoriavel_type.eql?("Contabilidade::AnulacaoDoEmpenho")
			identificacao_do_vistoriavel = "a Anulação do Empenho nº#{self.vistoriavel.try(:numero)}"
			caminho = "/contabilidade/anulacoes_do_empenho/#{self.vistoriavel_id}"
			informacoes_extras = ""

		elsif self.vistoriavel_type.eql?("Contabilidade::Liquidacao")
			identificacao_do_vistoriavel = "a Liquidacao nº#{self.try(:vistoriavel).try(:numero)} do Empenho #{self.try(:vistoriavel).try(:empenho).try(:numero_do_empenho_e_fornecedor)} e Unidade Orçamentária #{self.try(:unidade_orcamentaria).try(:nome)}"
			caminho = "/contabilidade/liquidacoes/#{self.vistoriavel_id}"
			if self.vistoriavel.nota_fiscal.blank?
				nota_fiscal = "SEM NOTA FISCAL"
			else
				nota_fiscal = "#{self.vistoriavel.nota_fiscal.numero_da_nota}"
			end
			informacoes_extras = "
			<p>Informações:</p>
			<ul>
				<li>Nº da Liquidação: #{self.vistoriavel.numero}</li>
				<li>Nº do Empenho: #{self.vistoriavel.empenho.numero_do_empenho}</li>
				<li>Fornecedor: #{self.vistoriavel.empenho.pessoa.nome}</li>
				<li>Unidade Orçamentária: #{self.vistoriavel.unidade_orcamentaria.nome}</li>
				<li>Nota Fiscal: #{nota_fiscal}</li>
			</ul>"
		elsif self.vistoriavel_type.eql?("Licitacao::Contrato")
			identificacao_do_vistoriavel = "o Contrato nº#{self.vistoriavel.numero}"
			caminho = "/licitacao/contratos/#{self.vistoriavel_id}"
			informacoes_extras = "
			<p>Informações</p>
			<ul>
				<li>Nº do Contrato #{self.vistoriavel.numero}</li>
				<li>Unidade Orçamentária #{self.vistoriavel.unidade_orcamentaria.nome}</li>
				<li>Fornecedor: #{self.vistoriavel.pessoa_do_projeto.empresa_nome}</li>
				<li>Final da Vigência: #{self.vistoriavel.data_final_de_acordo_com_aditivos}</li>
				<li>Dias até final da vigência: #{ self.vistoriavel.tempo_restante} dia(s)</li>
			</ul>"

		elsif	self.vistoriavel_type.eql?("Contabilidade::Empenho")
			identificacao_do_vistoriavel = "o Empenho nº#{self.vistoriavel.numero_do_empenho} da Unidade Orçamentária #{ self.vistoriavel.unidade_orcamentaria.nome}"
			caminho = "/empenhos/#{self.vistoriavel_id}"
			informacoes_extras = "<p>Informações Extras:</p>
			<ul>
			<li>Nº do Empenho: #{self.vistoriavel.numero_do_empenho}</li>
			<li>Unidade Orçamentária: #{ self.vistoriavel.unidade_orcamentaria.nome}</li>
			<li>Valor: #{self.vistoriavel.definir_valor_do_empenho.to_f.real_contabil}</li>
			<li>Fornecedor: #{self.vistoriavel.pessoa.nome}</li>
			</ul>"

		elsif self.vistoriavel_type.eql?("Contabilidade::Pagamento")
			identificacao_do_vistoriavel = "o Pagamento nº#{self.vistoriavel.try(:numero)}"
			caminho = "/contabilidade/pagamentos/#{self.vistoriavel_id}"
			informacoes_extras = ""

		elsif self.vistoriavel_type.eql?("Licitacao::Projeto")
			identificacao_do_vistoriavel = "o Projeto nº#{self.vistoriavel.try(:pedido).try(:numero)}"
			caminho = "/licitacao/projeto/#{self.vistoriavel_id}"
			informacoes_extras = ""

		elsif self.vistoriavel_type.eql?("Licitacao::Processo")
			identificacao_do_vistoriavel = "o Processo nº#{self.vistoriavel.try(:numero_do_processo)}"
			caminho = "/licitacao/processo/#{self.vistoriavel_id}"
			informacoes_extras = ""
		elsif self.vistoriavel_type.eql?("Licitacao::Aditivo")
			identificacao_do_vistoriavel = "o Processo nº#{self.vistoriavel.try(:numero_do_processo)}"
			caminho = "/licitacao/aditivo/#{self.vistoriavel_id}"
			informacoes_extras = ""
		end

		if(self.vistoriavel_type.eql?("Licitacao::Projeto") || self.vistoriavel_type.eql?("Licitacao::Processo"))
			usuarios = Set.new
			self.vistoriavel.unidades_orcamentarias.each do |uo|
				uo.usuarios.each do |usuario|
					usuarios << usuario
				end
			end
			usuarios = usuarios.to_a
		else
			unless self.vistoriavel_type.eql?("Licitacao::Aditivo")
				usuarios = self.vistoriavel.try(:unidade_orcamentaria).try(:usuarios).to_a
			else
				usuarios = self.vistoriavel.contrato.try(:unidade_orcamentaria).try(:usuarios).to_a
			end
		end
		titulo = I18n.t('titulos.parecer_da_procuradoria', status: status_do_parecer, identificacao: identificacao_do_vistoriavel)
		conteudo = I18n.t('mensagens.parecer_da_procuradoria', informacoes_extras: informacoes_extras, url_aplicacao: url_aplicacao, caminho: caminho)
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios)
	end

	def cria_mensagem_de_processo_homologado
		titulo = I18n.t('titulos.processo_homologado', numero_do_processo: self.try(:numero_do_processo))
		conteudo = I18n.t('mensagens.processo_homologado',	url_aplicacao: url_aplicacao, id_processo: self.id)
		usuarios =  Set.new
		self.unidades_orcamentarias.each do |uo|
			uo.usuarios.each do |usuario|
				usuarios << usuario
			end
		end
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a)
	end

	def cria_mensagem_de_transferencia_a_confirmar transferencia
		unidade_orcamentaria_de_destino = transferencia.conta_bancaria_destino.unidade_orcamentaria

		titulo = I18n.t('titulos.transferencia_a_confirmar', unidade_orcamentaria_da_conta_de_destino:  unidade_orcamentaria_de_destino.nome)
		conteudo = I18n.t('mensagens.transferencia_a_confirmar', unidade_orcamentaria_da_conta_origem: transferencia.conta_bancaria_origem.unidade_orcamentaria.unidade_gestora.nome, data_da_transferencia: transferencia.data, valor_da_transferencia: transferencia.valor.to_f.try(:real_contabil), id_da_transferencia: transferencia.id, url_aplicacao: url_aplicacao)
		perfis_validos_para_executar_a_acao = perfis_com_permissao_para_realizar_acao_em_um_controle("contabilidade/transferencias_financeiras", "update")
		usuarios = Set.new
		unidade_orcamentaria_de_destino.usuarios.each do |usuario|
			if usuario.administrador? || perfis_validos_para_executar_a_acao.include?(usuario.perfil.id)
				usuarios << usuario
			end
		end
		enviar_mensagem_para_usuarios(titulo, conteudo, usuarios.to_a) if !usuarios.nil?
	end

	def cria_mensagem_sobre_obra_nao_classificada obra
		titulo = I18n.t("titulos.obra_nao_classificada")
		conteudo = I18n.t("mensagens.obra_nao_classificada", url_aplicacao: url_aplicacao, id: obra.id)
		config = Configuracao.last
		if config.present? && !config.email_contabilidade.eql?("") && config.permite_envio_de_email && config.permite_enviar_alertas
			enviar_mensagem_para_email(titulo, conteudo, config.email_contabilidade)
		end
	end

	private
	def perfis_com_permissao_para_realizar_acao_em_um_controle(nome_do_controle, nome_da_acao)
		acessos = Acesso::Permissao.where(
			acao_id: Acesso::Acao.where(
				controle: Acesso::Controle.where(
					nome_do_controle: nome_do_controle
				),
				nome_da_acao: nome_da_acao
			)
		)
		perfis = []
		acessos.each do |acesso|
			perfis << acesso.perfil_id
		end
		perfis
	end
end
