class EdFi::Indiana::Sandbox::StudentEducationResponsibilityService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    school_year_students.preload(:ed_fi_choice).each { |s| student_props(s) }
  end

  def index_by_student(id)
    records = rest_client_request(
      :get,
      url,
      nil,
      header_params: { params: { studentUniqueId: id } }
    )
    records ? JSON.parse(records).map { |r| record_props(r) } : []
  end

  def find_record(id)
    response = rest_client_request(:get, "#{url}/#{id}", nil)
    response ? JSON.parse(response) : {}
  end

  def delete(id)
    rest_client_request(:delete, "#{url}/#{id}", nil)
  end

  def endpoint
    'ed-fi/studenteducationorganizationresponsibilityassociations'
  end

  private
    def organization_id
      @organization_id ||= school.additional_ids.school.first
    end

    def legal_settlement_url
      'uri://doe.in.gov/ResponsibilityDescriptor#Legal Settlement'
    end

    def accountability_url
      'uri://ed-fi.org/ResponsibilityDescriptor#Accountability'
    end

    def responsibility_url(choice)
      label = choice ? :Funding : :Attendance
      "uri://ed-fi.org/ResponsibilityDescriptor##{label}"
    end

    def adm_code_url
      'uri://doe.in.gov/ADMCodeDescriptor#10'
    end

    def student_props(school_year_student)
      choice = school_year_student.ed_fi_choice&.value
      student = school_year_student.student

      data = {}.tap do |props|
        props[:educationOrganizationReference] = {
          educationOrganizationId: organization_id.number
        }
        props[:studentReference] = {
          studentUniqueId: school_year_student.student.state_id
        }
        props[:responsibilityDescriptor] = responsibility_url(choice)
        props[:beginDate] = school_year_student.entry_date
        props[:endDate] = school_year_student.exit_date if school_year_student.exit_date
        props[:_ext] = {
          IDOE: {
            admCodeDescriptor: choice ? adm_code_url : nil,
            additionalEdOrgResponsibilities: [
              {
                schoolCorpResponsibilityDescriptor: legal_settlement_url,
                schoolCorpId: student.indiana_settlement_number&.number
              },
              {
                schoolCorpResponsibilityDescriptor: accountability_url,
                schoolCorpId: organization_id.number
              }
            ]
          }
        }
      end

      rest_client_request(:post, url, school_year_student, body: data.to_json)
    end

    def record_props(response)
      {
        id: response['id'],
        descriptor: response['responsibilityDescriptor'].split('#').last,
        date: response['_lastModifiedDate'].split('T').first
      }
    end
end
