class EdFi::Indiana::Sandbox::SessionService < EdFi::Indiana::Sandbox::ApplicationService
  def call
    return unless school_config.semesters? || school_config.trimesters?

    build_sessions.each { |d| rest_client_request(:post, url, reporting_config, body: d.to_json) }
  end

  def endpoint
    'ed-fi/sessions'
  end

  private
    def school_config
      @school_config ||= school.school_config
    end

    def school_days
      @school_days ||= school_year.school_days.ordered
    end

    def school_days_by_semester
      @school_days_by_semester ||= {
        1 => school_days.by_semester(:semester_1, school_year),
        2 => school_days.by_semester(:semester_2, school_year)
      }
    end

    def school_days_by_trimester
      @school_days_by_trimester ||= school_days.group_by(&:quarter)
    end

    def number_of_sessions
      school_config.semesters? ? 3 : 4
    end

    def build_sessions
      [].tap do |props|
        number_of_sessions.times do |index|
          term = index + 1
          term_school_days = if school_config.semesters?
            term == 3 ? school_days : school_days_by_semester[term]
          else
            term == 4 ? school_days : school_days_by_trimester[term]
          end
          props << session_props(term_school_days, term_school_days.count, term)
        end
      end
    end

    def session_props(days, count, index)
      term = if school_config.semesters?
        case index
        when 1
          'Fall Semester'
        when 2
          'Spring Semester'
        else
          'Year Round'
        end
      else
        term = case index
        when 1
          'First Trimester'
        when 2
          'Second Trimester'
        when 3
          'Third Trimester'
        else
          'Year Round'
        end
      end

      {}.tap do |props|
        props[:sessionName] = "#{school_year.academic_year} #{term}"
        props[:schoolReference] = { schoolId: state_id.number }
        props[:schoolYearTypeReference] = { schoolYear: school_year.academic_year }
        props[:beginDate] = days.first.date.strftime('%Y-%m-%d')
        props[:endDate] = days.last.date.strftime('%Y-%m-%d')
        props[:termDescriptor] = "uri://ed-fi.org/TermDescriptor##{term}"
        props[:totalInstructionalDays] = count
      end
    end
end
