class Corretor::CorrigirRedacaoController < ApplicationController
  ActionController::Parameters.permit_all_parameters = true
  before_action :autenticar_corretor

  def index
    if request.get?
      @redacao = Redacao.find(params[:id])
      if @redacao.nil?
        flash[:warning] = "Essa redação não existe."
        return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
      end

      if corretor_logado.em_correcao? && corretor_logado.id_da_redacao_em_correcao != @redacao.id.to_s
        return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
      end

      if @redacao.em_correcao? && corretor_logado.id_da_redacao_em_correcao != @redacao.id.to_s
        flash[:warning] = "Essa redação já encontra-se em correção."
        return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
      end

      if @redacao.corrigida?
        flash[:warning] = "Essa redação já encontra-se corrigida."
        return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
      end

      corretor_logado.update_attributes!(id_da_redacao_em_correcao: @redacao.id.to_s)
      @redacao.update_attributes!(status: 'Em correção', inicio_da_correcao: Time.now)

      render 'corretor/corrigir_redacao/index', layout: 'area_do_corretor'
    else
      @redacao = Redacao.find(params[:id])
      if @redacao.nil?
        flash[:warning] = "Essa redação não existe."
        return redirect_to(controller: 'index', action: 'index')
      end

      if @redacao.corrigida?
        flash[:warning] = "Esta redação já encontra-se corrigida."
        return redirect_to(controller: 'index', action: 'index')
      end
      
      [:nota_da_competencia_um, :nota_da_competencia_dois, :nota_da_competencia_tres, :nota_da_competencia_quatro, :nota_da_competencia_cinco].each do |nota_da_competencia|
        unless params[nota_da_competencia].present?
          flash.now[:warning] = "Preencha todas as notas."
          return render 'corretor/corrigir_redacao/index', layout: 'area_do_corretor'
        end

        if @redacao.correcao_em_video? && params[:video].empty?
          flash.now[:warning] = "Falta link do vídeo da correção."
          return render 'corretor/corrigir_redacao/index', layout: 'area_do_corretor'
        end
        
        begin
          correcao = Correcao.new
          correcao.redacao = @redacao
          correcao.corretor = corretor_logado
          correcao.comentario_geral = params[:comentario_geral]
          correcao.nota_da_competencia_um = params[:nota_da_competencia_um]
          correcao.nota_da_competencia_dois = params[:nota_da_competencia_dois]
          correcao.nota_da_competencia_tres = params[:nota_da_competencia_tres]
          correcao.nota_da_competencia_quatro = params[:nota_da_competencia_quatro]
          correcao.nota_da_competencia_cinco = params[:nota_da_competencia_cinco]
          if @redacao.correcao_em_video?
            correcao.video = params[:video]
          end
          correcao.save!
          
          corretor_logado.update_attributes!(id_da_redacao_em_correcao: nil)
          @redacao.update_attributes!(status: 'Corrigida', fim_da_correcao: Time.now)
          flash[:success] = "Obrigado por realizar a correção desta redação."
          AlunoMailer.redacao_corrigida(@redacao).deliver
          return redirect_to(controller: 'redacao_corrigida', action: 'index', id: @redacao.id)
        rescue => exception
          
          ap exception
          flash.now[:warning] = "Ocorreu um erro ao tentar lançar as notas. Tente novamente."
          return render 'corretor/corrigir_redacao/index', layout: 'area_do_corretor'
        end
      end
    end
  end

  def marcacoes_no_texto
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    render json: {
      rows: @redacao.marcacoes_no_texto
    }, status: 200
  end

  def criar_marcacao_no_texto
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      marcacao = {}
      marcacao['id'] = BSON::ObjectId.new.to_s
      marcacao['ranges'] = JSON.parse(params.to_json)['ranges']
      marcacao['quote'] = JSON.parse(params.to_json)['quote']
      marcacao['text'] = JSON.parse(params.to_json)['text']
      @redacao.marcacoes_no_texto.push(marcacao)
      @redacao.save!
      render json: marcacao, status: 200
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def atualizar_marcacao_no_texto
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      marcacao = {}
      marcacao['ranges'] = JSON.parse(params.to_json)['ranges']
      marcacao['quote'] = JSON.parse(params.to_json)['quote']
      marcacao['text'] = JSON.parse(params.to_json)['text']
      index_da_marcacao = @redacao.marcacoes_no_texto.find_index {|a| a['id'] == params[:marcacao_id]}
      marcacao['id'] = @redacao.marcacoes_no_texto[index_da_marcacao]['id']
      @redacao.marcacoes_no_texto[index_da_marcacao] = marcacao
      @redacao.save!
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end
  
  def apagar_marcacao_no_texto
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
    index_da_marcacao = @redacao.marcacoes_no_texto.find_index {|a| a['id'] == params[:marcacao_id]}
    @redacao.marcacoes_no_texto.delete_at(index_da_marcacao)
    @redacao.save!
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def marcacoes_na_imagem
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    render json: @redacao.marcacoes_na_imagem, status: 200
  end

  def criar_marcacao_na_imagem
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      marcacao = JSON.parse(params.to_json)['marcacao']
      marcacao['id'] = BSON::ObjectId.new.to_s 
      @redacao.marcacoes_na_imagem.push(marcacao)
      @redacao.save!
      render json: marcacao, status: 200
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def atualizar_marcacao_na_imagem
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      marcacao = JSON.parse(params.to_json)['marcacao']
      index_da_marcacao = @redacao.marcacoes_na_imagem.find_index {|a| a['id'] == params[:marcacao_id]}
      marcacao['id'] = @redacao.marcacoes_na_imagem[index_da_marcacao]['id']
      @redacao.marcacoes_na_imagem[index_da_marcacao] = marcacao
      @redacao.save!
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def apagar_marcacao_na_imagem
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
    index_da_marcacao = @redacao.marcacoes_na_imagem.find_index {|a| a['id'] == params[:marcacao_id]}
    @redacao.marcacoes_na_imagem.delete_at(index_da_marcacao)
    @redacao.save!
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def criar_comentario_em_audio
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      audio = Tempfile.new([@redacao.id, '.mp3'])
      File.open(audio.path, 'wb') do |f|
        f.write Base64.decode64(params[:data].split(',')[1])
      end
      FileUtils.cp(audio.path, File.join('public', 'storage', File.basename(audio.path)))
      FileUtils.chmod(775, File.join('public', 'storage', File.basename(audio.path)))
      comentario_em_audio = {}
      comentario_em_audio['created_at'] = Time.now
      comentario_em_audio['id'] = BSON::ObjectId.new.to_s
      comentario_em_audio['url'] = Rails.env.development? ? File.join(request.protocol + request.host_with_port + '/storage', File.basename(audio.path)) : "#{ENV['STORAGE_HOST']}/#{File.basename(audio.path)}"
      comentario_em_audio['corretor_id'] = corretor_logado.id.to_s
      @redacao.comentarios_em_audio.push(comentario_em_audio)
      @redacao.save!
      render json: comentario_em_audio, status: 200
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def apagar_comentario_em_audio
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return head :bad_request, content_type: 'application/json'
    end

    begin
      index_do_comentario = @redacao.comentarios_em_audio.find_index {|a| a['id'] == params[:comentario_id]}
      @redacao.comentarios_em_audio.delete_at(index_do_comentario)
      @redacao.save!
    rescue => exception
      
      return head :bad_request, content_type: 'application/json'
    end
  end

  def anular
    motivo_da_anulacao = params[:m].to_i == 1 ? "Não é uma redação" : "Imagem ilegível"
    @redacao = Redacao.find(params[:id])
    if @redacao.nil?
      return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
    end

    if params[:m].to_i == 2 && @redacao.tipo != 'imagem'
      return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
    end

    if corretor_logado.id_da_redacao_em_correcao != @redacao.id.to_s
      return redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
    end

    @redacao.anular!
    @redacao.update_attributes!(motivo_da_anulacao: motivo_da_anulacao)
    corretor_logado.update_attributes!(id_da_redacao_em_correcao: nil)
    AlunoMailer.redacao_anulada(@redacao).deliver
    flash[:success] = 'A redação foi anulada.'
    redirect_to(controller: 'redacoes_a_corrigir', action: 'index')
  end
end
