class LearningObjectsController < ApplicationController
  before_action :set_learning_object, only: [:show, :edit, :update, :destroy, :like, :bookmarks, :collections]
  after_action :increment_learning_object_views, only: [:show]
  before_action :authenticate_user!, except: [:index, :show, :like]
  before_action :set_complaint_messages, only: :show
  before_action :login_on_dspace, only: :create

  # GET /learning_objects
  # GET /learning_objects.json
  def index
    @learning_objects = learning_object_repository.all
  end

  # GET /learning_objects/1
  # GET /learning_objects/1.json
  def show
  end

  # GET /learning_objects/new
  def new
    @learning_object = LearningObject.new
    @school_levels = ['Educação Infantil', 'Ensino Fundamental', 'Ensino Médio']
    @subjects = Subject.default_list
  end

  # GET /learning_objects/1/edit
  def edit
  end

  # POST /learning_objects
  # POST /learning_objects.json
  def create
    id_collection = '4'
    # TODO: the code is doing an extra requisition that is not necessary, need to fix it
    repo = Dspace::Client.instance.repository.collection_repository
    collection = repo.get_collection_by_id(id_collection)

    args = {}
    args['name'] = learning_object_params[:name]
    args['type'] = learning_object_params[:type]
    args['last_modified'] = Time.now.to_s
    args['metadata'] = {
      "dc.title" => learning_object_params["name"],
      "dc.contributor.author" => learning_object_params["author"],
      "dc.description" => learning_object_params["description"],
      "dc.language" => learning_object_params["language"],
      "dc.source" => learning_object_params["source"],
      "dc.type" => learning_object_params["type"],
      "dc.date.issued" => Time.now.to_s,
      "dc.rights" => learning_object_params["license"],
      "dc.rights.holder" => learning_object_params["copyright"],
      "dc.location.country" => learning_object_params["country"],
      "dc.date.accessioned" => Time.now.to_s,
      "dc.date.available" => Time.now.to_s
    }
    # trata o form do learning object
    lo = DSpaceRest::Item.new(args)
    dspace_keys = get_dspace_metadata_names("invert")
    learning_object_params.each do |k,v|
      unless dspace_keys[k].nil?
        aula.add_metadata(dspace_keys[k], v, "pt-BR")
      end
    end
    aaa
    collection_repository.create_item_for(collection, lo)

    subjects = []
    learning_object_params[:subjects].each do |subject|
      subjects << subject_repository.find_by_name(subject)
    end
    @learning_object = LearningObject.new(learning_object_params)
    @learning_object.subjects = subjects
    @learning_object.created_at = Time.now
    @learning_object.last_modified = Time.now
    @learning_object.publisher = current_user
    @learning_object.metadata = nil
    respond_to do |format|
      if learning_object_repository.create @learning_object
        learning_object_repository.create_relations(@learning_object)
        format.html { redirect_to me_users_path, notice: 'Learning object was successfully created.' }
      else
        format.html { render :new }
      end
    end
  end

  # PATCH/PUT /learning_objects/1
  # PATCH/PUT /learning_objects/1.json
  def update
    respond_to do |format|
      if learning_object_repository.update(learning_object_params)
        format.html { redirect_to @learning_object, notice: 'Learning object was successfully updated.' }
      else
        format.html { render :edit }
      end
    end
  end

  # DELETE /learning_objects/1
  # DELETE /learning_objects/1.json
  def destroy
    learning_object_repository.destroy @learning_object

    respond_to do |format|
      format.html { redirect_to learning_objects_url, notice: 'Learning object was successfully destroyed.' }
    end
  end

  def report_object
    learning_object_repository.report current_user, @learning_object, message, description
  end

  # POST /learning_objects/1/like
  def like
    if @learning_object.liked? current_user
      @learning_object.dislike current_user
    else
      @learning_object.like current_user
    end

    if request.xhr?
      render json: {count: @learning_object.likes, id: params[:id]}
    end
  end

  # POST /learning_objects/1/bookmarks
  def bookmarks
    bookmarks = current_user.bookmarks
    bookmarks.add @learning_object
    collection_repository.save_learning_objects bookmarks

    if request.xhr?
      render json: {id: params[:id]}
    end
  end

  # GET /learning_objects/1/collections.json
  def collections
    @collections = @learning_object.collections
  end

  private

  def get_dspace_metadata_names(invert=nil)
    h = {
        "dc.title" => "name",
        "dc.contributor.author" => "author",
        "dc.description" => "description",
        "dc.language" => "language",
        "dc.source" => "source",
        "dc.type" => "type",
        "dc.date.issued" => "date",
        "dc.rights" => "license",
        "dc.rights.holder" => "copyright",
        "dc.location.country" => "country",
        "dc.date.accessioned" => "date_created",
        "dc.date.available" => "date_available"
        # TODO: subjects dc.subject.category

    }
    if (invert != nil)
      return h.invert
    end
    h
  end

  def login_on_dspace
    Dspace::Client.instance.login 'admin@mecdb3.c3sl.ufpr.br', 'admin'
  end

  # Use callbacks to share common setup or constraints between actions.
  def set_learning_object
    @learning_object = learning_object_repository.find params[:id]
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def learning_object_params
    params[:learning_object]
  end

  def increment_learning_object_views
    if user_signed_in?
      learning_object_repository.increment_views current_user, @learning_object
    end
  end

  def set_complaint_messages
    @complaint = Complaint.new
    @messages = [
        Complaint.copyrights,
        Complaint.ofensive_content,
        Complaint.ofensive_user,
        Complaint.fake_user
    ]
  end

end