class TasksController < ApplicationController
  # auto_complete_for :user, :nick

  def index
    @non_group_tasks = Task.non_group.order('due_date', 'name').includes(assignments: :user)
    @groups = Workgroup.order(:name).includes(open_tasks: { assignments: :user })
  end

  def user
    @unaccepted_tasks = Task.unaccepted_tasks_for(current_user)
    @accepted_tasks = Task.accepted_tasks_for(current_user)
  end

  def show
    @task = Task.find(params[:id])
  end

  def new
    @task = Task.new(current_user_id: current_user.id)
  end

  def edit
    @task = Task.find(params[:id])
    @periodic = !!params[:periodic]
    @task.current_user_id = current_user.id
  end

  def create
    @task = Task.new(current_user_id: current_user.id)
    @task.created_by = current_user
    @task.attributes = (task_params)
    @task.periodic_task_group = PeriodicTaskGroup.new if params[:periodic]
    if @task.save
      @task.periodic_task_group.create_tasks_for_upfront_days if params[:periodic]
      redirect_to tasks_url, notice: I18n.t('tasks.create.notice')
    else
      render template: 'tasks/new'
    end
  end

  def update
    @task = Task.find(params[:id])
    task_group = @task.periodic_task_group
    was_periodic = @task.periodic?
    prev_due_date = @task.due_date
    @task.current_user_id = current_user.id
    @task.attributes = (task_params)
    if @task.errors.empty? && @task.save
      task_group.update_tasks_including(@task, prev_due_date) if params[:periodic]
      flash[:notice] = I18n.t('tasks.update.notice')
      flash[:notice] = I18n.t('tasks.update.notice_converted') if was_periodic && !@task.periodic?
      if @task.workgroup
        redirect_to workgroup_tasks_url(workgroup_id: @task.workgroup_id)
      else
        redirect_to tasks_url
      end
    else
      render template: 'tasks/edit'
    end
  end

  def destroy
    task = Task.find(params[:id])
    # Save user_ids to update apple statistics after destroy
    user_ids = task.user_ids
    if params[:periodic]
      task.periodic_task_group.exclude_tasks_before(task)
      task.periodic_task_group.destroy
    else
      task.destroy
    end
    task.update_ordergroup_stats(user_ids)

    redirect_to tasks_url, notice: I18n.t('tasks.destroy.notice')
  end

  # assign current_user to the task and set the assignment to "accepted"
  # if there is already an assignment, only accepted will be set to true
  def accept
    task = Task.find(params[:id])
    if ass = task.is_assigned?(current_user)
      ass.update_attribute(:accepted, true)
    else
      task.assignments.create(user: current_user, accepted: true)
    end
    redirect_to user_tasks_path, notice: I18n.t('tasks.accept.notice')
  end

  # deletes assignment between current_user and given taskcurrent_user_id: current_user.id
  def reject
    Task.find(params[:id]).users.delete(current_user)
    redirect_to action: 'index'
  end

  def set_done
    Task.find(params[:id]).update_attribute :done, true
    redirect_to tasks_url, notice: I18n.t('tasks.set_done.notice')
  end

  # Shows all tasks, which are already done
  def archive
    @tasks = Task.done.page(params[:page]).per(@per_page).order('tasks.updated_on DESC').includes(assignments: :user)
  end

  # shows workgroup (normal group) to edit weekly_tasks_template
  def workgroup
    @group = Group.find(params[:workgroup_id])
    return unless @group.is_a? Ordergroup

    redirect_to tasks_url, alert: I18n.t('tasks.error_not_found')
  end

  private

  def task_params
    params
      .require(:task)
      .permit(:name, :description, :duration, :user_list, :required_users, :workgroup_id, :due_date, :done)
  end
end
