class Admin::Course::CoursesController < Admin::Course::Controller
  def index
    render_success :ok, json: courses.ordered.map { |c| course_props(c) }
  end

  def show
    render_success :ok, json: course_props(course)
  end

  def create
    course = courses.build(course_params)
    if course.save
      render_success :ok, json: course_props(course)
    else
      render_error :unprocessable_entity, errors: course
    end
  end

  def update
    if course.update(course_params)
      render_success :ok, json: course_props(course)
    else
      render_error :unprocessable_entity, errors: course
    end
  end

  def destroy
    if course.destroy
      render_success :ok
    else
      render_error :unprocessable_entity
    end
  end

  private
    def courses
      current_school.courses.includes(:classrooms)
    end

    def course
      @course ||= courses.find_by(id: params[:id])
    end

    def department
      current_school.departments.find_by(id: params[:department_id])
    end

    def area
      :courses
    end

    def state_descriptors
      @state_descriptors ||= EdFi::Indiana::Sandbox::DescriptorService
        .call(current_school_year.id, descriptor: :courses)
        .index_by { |d| d['id'] }
    end

    def associations
      {}.tap do |props|
        props[:department] = department if params.key?(:department_id)
      end
    end

    def course_params
      params.permit(
        :name,
        :code,
        :archived,
        :state_descriptor,
        :core,
        :credits,
        :length,
        grades_attributes: [:id, :grade, :_destroy]
      ).merge(associations)
    end

    def course_props(course)
      {}.tap do |props|
        props[:id] = course.id
        props[:name] = course.name
        props[:code] = course.code
        props[:core] = course.core
        props[:credits] = course.credits
        props[:length] = course.length?
        props[:archived] = course.archived
        props[:state_descriptor] = course.state_descriptor
        props[:department_id] = course.department_id
        props[:classrooms_attached] = course.classrooms.size
        return props unless [:show, :update].include?(action_name.to_sym)

        props[:department_name] = course.department&.name
        if current_school.ed_fi_system_indiana?
          state_descriptor = state_descriptors[course.state_descriptor] || {}
          props[:state_name] = state_descriptor['title']
        end
        props[:grades_attributes] = course.grades.ordered.map do |grade|
          grade.attributes.merge(grade_label: grade_levels[grade.grade])
        end
      end
    end
end
