<commit_before>class UbicacionesController < ApplicationController

  skip_before_filter :verify_authenticity_token, :set_locale

  # Registros con un radio alreadedor de tu ubicación
  def ubicacion
  end

  # /explora-por-region
  def por_region
  end

  # Regresa el conteo por grupo del servicio de Abraham, no lo hago directo porque lo guardo en cache ya que
  # algunas peticiones tardan 20 segundos
  def conteo_por_grupo

    if params[:tipo_region].present?
      if params[:tipo_region] == 'estado' && params[:region_id].present?
        key = "conteo_grupo_#{params[:region_id]}"
        url = "#{CONFIG.ssig_api}/taxonEdo/conteo/total/#{params[:region_id].rjust(2, '0')}?apiKey=enciclovida"
      elsif params[:tipo_region] == 'municipio' && params[:region_id].present? && params[:parent_id].present?
        key = "conteo_grupo_#{params[:parent_id]}_#{params[:region_id]}"
        url = "#{CONFIG.ssig_api}/taxonMuni/listado/total/#{params[:parent_id]}/#{params[:region_id]}?apiKey=enciclovida"
      else
        resp = {estatus: false, msg: "El parámetro 'tipo_region' no es el correcto."}
      end

      if key.present?
        resp = Rails.cache.fetch(key, expires_in: eval(CONFIG.cache.busquedas_region.conteo_grupo)) do
          respuesta_conteo_por_grupo(url)
        end
      end

    else
      resp = {estatus: false, msg: "El parámetro 'tipo_region' esta vacío."}
    end

    render json: resp
  end

  def especies_por_grupo
    br = BusquedaRegion.new
    br.params = params
    resp = br.cache_especies_por_grupo

    # Una vez obtenida la respuesta del servicio o del cache iteramos en la base
    if resp[:estatus]
      especies_hash = {}

      resp[:resultados].each do |r|
        especies_hash[r['especievalidabusqueda']] = r['nregistros'].to_i
      end
      especies_hash = especies_hash.sort_by {|key, value| value}.reverse.to_h

      br.nombres_cientificos = especies_hash.keys
      taxones = br.cache_especies_por_grupo_con_filtros

      taxones.each do |taxon|
        especies_hash[taxon[:nombre_cientifico]] = taxon.merge({nregistros: especies_hash[taxon[:nombre_cientifico]]})
      end

      resp = {estatus: true, resultados: especies_hash.values}
    end

    render json: resp
  end

  # Devuelve los municipios por el estado seleccionado
  def municipios_por_estado
    resp = {}
    resp[:estatus] = false

    if params[:region_id].present?
      resp[:estatus] = true
      parent_id = Estado::CORRESPONDENCIA[params[:region_id].to_i]
      municipios = Municipio.campos_min.where(cve_ent: parent_id)
      resp[:resultados] = municipios.map{|m| {region_id: m.region_id, nombre_region: m.nombre_region}}
      resp[:parent_id] = parent_id
    else
      resp[:msg] = 'El argumento region_id está vacio'
    end

    render json: resp
  end

  def busquedas_avanzada
    busqueda = Especie
    Busqueda.filtros_default(busqueda, params)
  end

  # Descarga el listado de especies por region
  def descarga_taxa
    lista = Lista.new
    columnas = Lista::COLUMNAS_DEFAULT + Lista::COLUMNAS_RIESGO_COMERCIO + Lista::COLUMNAS_CATEGORIAS_PRINCIPALES
    lista.columnas = columnas.join(',')
    lista.formato = 'xlsx'
    lista.cadena_especies = params[:especies].join(',')
    lista.usuario_id = 0  # Quiere decir que es una descarga, la guardo en lista para tener un control y poder correr delayed_job

    if params[:especies].length > 0
      # Para saber si el correo es correcto y poder enviar la descarga
      if  Usuario::CORREO_REGEX.match(params[:correo]) ? true : false
        # el nombre de la lista es cuando la solicito y el correo
        lista.nombre_lista = Time.now.strftime("%Y-%m-%d_%H-%M-%S-%L") + "_taxa_EncicloVida|#{params[:correo]}"

        if Rails.env.production?
          lista.delay(:priority => 2, queue: 'descargar_taxa').to_excel({ubicaciones: true, correo: params[:correo]}) if lista.save
        else  # Para develpment o test
          lista.to_excel({ubicaciones: true, correo: params[:correo]}) if lista.save
        end

        render json: {estatus: true}

      else  # Por si no puso un correo valido
        render json: {estatus: false, msg: 'El correo no es válido.'}
      end

    else  # No entro a ningun condicional, es un error
      render json: {estatus: false, msg: 'No hubo especies para la descarga'}
    end  # end especies > 0
  end


  private

  # Es el servicio de conteo de Abraham
  def respuesta_conteo_por_grupo(url)
    begin<commit_msg>descarga de taxa ahora esta empaquetada<commit_after>class UbicacionesController < ApplicationController

  skip_before_filter :verify_authenticity_token, :set_locale

  # Registros con un radio alreadedor de tu ubicación
  def ubicacion
  end

  # /explora-por-region
  def por_region
  end

  # Regresa el conteo por grupo del servicio de Abraham, no lo hago directo porque lo guardo en cache ya que
  # algunas peticiones tardan 20 segundos
  def conteo_por_grupo

    if params[:tipo_region].present?
      if params[:tipo_region] == 'estado' && params[:region_id].present?
        key = "conteo_grupo_#{params[:region_id]}"
        url = "#{CONFIG.ssig_api}/taxonEdo/conteo/total/#{params[:region_id].rjust(2, '0')}?apiKey=enciclovida"
      elsif params[:tipo_region] == 'municipio' && params[:region_id].present? && params[:parent_id].present?
        key = "conteo_grupo_#{params[:parent_id]}_#{params[:region_id]}"
        url = "#{CONFIG.ssig_api}/taxonMuni/listado/total/#{params[:parent_id]}/#{params[:region_id]}?apiKey=enciclovida"
      else
        resp = {estatus: false, msg: "El parámetro 'tipo_region' no es el correcto."}
      end

      if key.present?
        resp = Rails.cache.fetch(key, expires_in: eval(CONFIG.cache.busquedas_region.conteo_grupo)) do
          respuesta_conteo_por_grupo(url)
        end
      end

    else
      resp = {estatus: false, msg: "El parámetro 'tipo_region' esta vacío."}
    end

    render json: resp
  end

  def especies_por_grupo
    br = BusquedaRegion.new
    br.params = params
    resp = br.cache_especies_por_grupo

    # Una vez obtenida la respuesta del servicio o del cache iteramos en la base
    if resp[:estatus]
      especies_hash = {}

      resp[:resultados].each do |r|
        especies_hash[r['especievalidabusqueda']] = r['nregistros'].to_i
      end
      especies_hash = especies_hash.sort_by {|key, value| value}.reverse.to_h

      br.nombres_cientificos = especies_hash.keys
      taxones = br.cache_especies_por_grupo_con_filtros

      taxones.each do |taxon|
        especies_hash[taxon[:nombre_cientifico]] = taxon.merge({nregistros: especies_hash[taxon[:nombre_cientifico]]})
      end

      resp = {estatus: true, resultados: especies_hash.values}
    end

    render json: resp
  end

  # Devuelve los municipios por el estado seleccionado
  def municipios_por_estado
    resp = {}
    resp[:estatus] = false

    if params[:region_id].present?
      resp[:estatus] = true
      parent_id = Estado::CORRESPONDENCIA[params[:region_id].to_i]
      municipios = Municipio.campos_min.where(cve_ent: parent_id)
      resp[:resultados] = municipios.map{|m| {region_id: m.region_id, nombre_region: m.nombre_region}}
      resp[:parent_id] = parent_id
    else
      resp[:msg] = 'El argumento region_id está vacio'
    end

    render json: resp
  end

  def busquedas_avanzada
    busqueda = Especie
    Busqueda.filtros_default(busqueda, params)
  end

  # Descarga el listado de especies por region
  def descarga_taxa
    lista = Lista.new
    columnas = Lista::COLUMNAS_DEFAULT + Lista::COLUMNAS_RIESGO_COMERCIO + Lista::COLUMNAS_CATEGORIAS_PRINCIPALES
    lista.columnas = columnas.join(',')
    lista.formato = 'xlsx'
    lista.usuario_id = 0  # Quiere decir que es una descarga, la guardo en lista para tener un control y poder correr delayed_job

    # Para saber si el correo es correcto y poder enviar la descarga
    if  Usuario::CORREO_REGEX.match(params[:correo]) ? true : false
      # el nombre de la lista es cuando la solicito y el correo
      lista.nombre_lista = Time.now.strftime("%Y-%m-%d_%H-%M-%S-%L") + "_taxa_EncicloVida|#{params[:correo]}"

      br = BusquedaRegion.new
      br.params = params
      resp = br.cache_especies_por_grupo

      # Una vez obtenida la respuesta del servicio o del cache iteramos en la base
      if resp[:estatus]
        br.nombres_cientificos = resp[:resultados].map{|r| r['especievalidabusqueda']}
        taxones = br.cache_especies_por_grupo_con_filtros
        lista.cadena_especies = taxones.map{|t| t[:id]}.join(',')

        if Rails.env.production?
          lista.delay(queue: 'descargar_taxa').to_excel({ubicaciones: true, correo: params[:correo]}) if lista.save
        else  # Para develpment o test
          lista.to_excel({ubicaciones: true, correo: params[:correo]}) if lista.save
        end

        render json: {estatus: true}

      else
        render json: {estatus: false, msg: 'Falló el cache de especies_por_grupo'}
      end

    else  # Por si no puso un correo valido
      render json: {estatus: false, msg: 'El correo no es válido.'}
    end

  end


  private

  # Es el servicio de conteo de Abraham
  def respuesta_conteo_por_grupo(url)
    begin
{'fraction_non_alphanumeric': 0.10184983677910772, 'fraction_numerical': 0.0014145810663764961, 'mean_word_length': 3.3579895685158845, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6707196', 'n_tokens_mistral': 3285, 'n_tokens_neox': 3254, 'n_words': 751}