class Admin::Legacy::Student::Students::AccommodationsController <
  Admin::Legacy::Student::Controller
  include EdFi::IndianaHelper

  def index
    data = accommodations.by_assessment(params[:assessment]).ordered
    render_success :ok, json: {
      accommodations: data.map { |p| accommodation_props(p) },
      environment: current_school.find_or_build_ed_fi_indiana_environment.environment
    }
  end

  def show
    render_success :ok, json: accommodation_props(accommodations)
  end

  def create
    accommodation = accommodations.build(accommodation_params)

    if accommodation.save
      render_success :ok, json: accommodation_props(accommodation)
    else
      render_error :unprocessable_entity, errors: accommodation
    end
  end

  def update
    if accommodation.update(accommodation_params)
      render_success :ok, json: accommodation_props(accommodation)
    else
      render_error :unprocessable_entity, errors: accommodation
    end
  end

  def destroy
    if accommodation.ed_fi_id.present?
      if transactional_delete
        render_success :ok
      else
        render_error :unprocessable_entity, errors: accommodation
      end
    else
      if accommodation.destroy
        render_success :ok
      else
        render_error :unprocessable_entity, errors: accommodation
      end
    end
  end

  private
    def school_year
      @school_year ||= current_school.school_years.find_by(id: params[:school_year_id])
    end

    def accommodations
      student.ed_fi_accommodations.by_year(school_year)
    end

    def accommodation
      @accommodation ||= accommodations.find_by(id: params[:id])
    end

    def student
      @student ||= current_school.students.find_by(id: params[:student_id])
    end

    def transactional_delete
      accommodation.transaction do
        accommodation_service.delete_from_dex(accommodation.ed_fi_id)
        accommodation.destroy
      end
    end

    def accommodation_descriptors
      @accommodation_descriptors ||= descriptor_service(
        current_school_year.id,
        descriptor: :accommodationDescriptors
      ).index_by { |d| d['id'] }
    end

    def academic_subject_descriptors
      @academic_subject_descriptors ||= descriptor_service(
        current_school_year.id,
        descriptor: :academicSubjectDescriptors
      ).index_by { |d| d['id'] }
    end

    def accommodation_service
      EdFi::Indiana::Sandbox::StudentAccommodationService.new(current_school_year.id)
    end

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

    def accommodation_params
      params.permit(
        :assessment,
        :accommodation_descriptor,
        :academic_subject_descriptor
      ).merge(associations)
    end

    def accommodation_props(accommodation)
      accommodation_descriptor = accommodation_descriptors[accommodation.accommodation_descriptor]
      academic_subject_descriptor =
        academic_subject_descriptors[accommodation.academic_subject_descriptor]

      {}.tap do |props|
        props[:id] = accommodation.id
        props[:school_year_id] = accommodation.school_year_id
        props[:assessment] = accommodation.assessment
        props[:assessment_label] = accommodation.decorate.assessment_label
        props[:accommodation_descriptor] = accommodation.accommodation_descriptor
        props[:academic_subject_descriptor] = accommodation.academic_subject_descriptor
        props[:accommodation_description] = if accommodation_descriptor
          accommodation_descriptor['shortDescription']
        end
        props[:academic_subject_description] = if academic_subject_descriptor
          academic_subject_descriptor['shortDescription']
        end
      end
    end
end
