class OneRoster::GradingPeriodsController < OneRoster::Controller
  include OneRoster::AcademicSessionScoped

  before_action :authorize_roster_scope
  after_action :set_total_count_header, only: :index

  def index
    render_success :ok, json: { academicSessions:  session_grading_periods }
  end

  def show
    render_success :ok, json: { academicSession: session_grading_periods }
  end

  private
    def session_grading_periods
      if action_name.to_sym == :show
        decoded = decode_session_source

        return {} unless decoded[:type].include? 'grading_period'

        session_props(decoded[:session], decoded[:name], decoded[:year])
      elsif params.key?(:term_id)
        decoded = decode_session_source(params[:term_id])
        return {} unless decoded[:type] == 'term'

        type = 'gradingPeriod'
        grading_periods = []

        if ['semesters', 'semester'].include?(school_config.school_year_type)
          semester_quarters(decoded[:session])&.each do |key|
            name = school_config.quarters[key]
            grading_periods << session_props(key, name, decoded[:year], type)
          end
          type = 'semester_grading_period'
          name = school_config.semesters[decoded[:session]]
          grading_periods << session_props(decoded[:session], name, decoded[:year], type)
        else
          grading_periods << session_props(decoded[:session], decoded[:name], decoded[:year], type)
        end

        grading_periods
      else
        academic_sessions.select { |k| k[:type] == 'gradingPeriod' }
      end
    end

    def set_total_count_header
      response.set_header('X-Total-Count', session_grading_periods.count.to_s)
    end
end
