class CourseStagesController < ApplicationController
  before_action :require_login
  before_action :find_course, only: [:create]
  before_action :find_course_stage, only: [:update, :destroy, :edit, :up_position, :down_position]
  before_action :user_course_identity, :teacher_allowed

  def create
    ActiveRecord::Base.transaction do
      begin
        @stage = CourseStage.new(stage_params)
        @stage.course_id = @course.id
        @stage.position = @course.course_stages.count + 1
        @stage.save!
        unless params[:shixun_id].blank?
          shixuns = Shixun.where(id: params[:shixun_id]).order("field(id, #{params[:shixun_id].join(",")})")
          shixuns.each do |shixun|
            CourseStageShixun.create!(course_stage_id: @stage.id, course_id: @course.id, shixun_id: shixun.id, position: @stage.course_stage_shixuns.count + 1)
          end
        end
        normal_status("创建成功")
      rescue Exception => e
        uid_logger_error(e.message)
        tip_exception(e.message)
        raise ActiveRecord::Rollback
      end
    end
  end

  def edit

  end

  def update
    ActiveRecord::Base.transaction do
      begin
        @stage.update_attributes!(stage_params)
        @stage.course_stage_shixuns.destroy_all
        unless params[:shixun_id].blank?
          params[:shixun_id].each do |shixun_id|
            shixun = Shixun.where(id: shixun_id).first
            @stage.course_stage_shixuns.create!(course_id: @course.id, shixun_id: shixun.id, position: @stage.course_stage_shixuns.count + 1) if shixun.present?
          end
        end
        normal_status("更新成功")
      rescue Exception => e
        uid_logger_error(e.message)
        tip_exception(e.message)
        raise ActiveRecord::Rollback
      end
    end
  end

  def destroy
    ActiveRecord::Base.transaction do
      @course.course_stages.where("position > ?", @stage.position).update_all("position = position - 1")
      @stage.destroy!
      normal_status("删除成功")
    end
  end

  def up_position
    ActiveRecord::Base.transaction do
      begin
        position = @stage.position
        tip_exception("第一章不能向上移动") if @stage.position == 1
        pre_stage = @course.course_stages.where(position: position - 1).first
        pre_stage.update_attributes(position: position)
        @stage.update_attributes(position: position - 1)
        normal_status("更新成功")
      rescue Exception => e
        uid_logger("stage up failed: #{e.message}")
        raise ActiveRecord::Rollback
      end
    end
  end

  def down_position
    ActiveRecord::Base.transaction do
      begin
        position = @stage.position
        rails "最后一章不能向下移动" if @stage.position == @course.course_stages.count
        next_stage = @course.course_stages.where(position: position + 1).first
        next_stage.update_attributes(position: position)
        @stage.update_attributes(position: position + 1)
        normal_status("更新成功")
      rescue Exception => e
        uid_logger("stage up failed: #{e.message}")
        raise ActiveRecord::Rollback
      end
    end
  end

  private

  def find_course_stage
    @stage = CourseStage.find_by!(id: params[:id])
    @course = @stage.course
  end

  def stage_params
    tip_exception("章节名称不能为空") if params[:name].blank?
    params.permit(:name, :description)
  end

end
