class EdFi::Indiana::Sandbox::StaffAssignmentAssociationService <
  EdFi::Indiana::Sandbox::ApplicationService
  def call
    employees.each { |e| props(e) }
  end

  def delete
    rest_client_request(:delete, "#{url}/#{@params[:id]}", @params[:employee])
  end

  def endpoint
    'ed-fi/staffeducationorganizationassignmentassociations'
  end

  private
    def employees
      school.employees
        .preload(:state_id)
        .joins(:positions, :state_id)
        .position_within_date_range(semester_range)
    end

    def employee_positions_in_range
      @employee_positions_in_range ||= school.employee_positions
        .within_date_range(semester_range)
        .group_by(&:employee_id)
    end

    def semester_range
      semester = school.school_config.trimesters? ? 2 : school_year.current_semester
      school_year.semester_date_range(semester)
    end

    def classification_descriptors
      @classification_descriptors ||= descriptor_service(:staffclassificationdescriptors)
        .map { |d| [d['id'], d['codeValue']] }
        .to_h
    end

    def classification_url(descriptor)
      ed_fi_names = ['LEA Administrator', 'Librarians/Media Support Staff', 'School Administrator']
      if ed_fi_names.include?(descriptor)
        "uri://ed-fi.org/StaffClassificationDescriptor##{descriptor}"
      else
        "uri://doe.in.gov/StaffClassificationDescriptor##{descriptor}"
      end
    end

    def props(employee)
      employee_positions_in_range[employee.id].each do |position|
        next if position.position.edfi_id.blank?

        descriptor = position.position.edfi_id
        data = {
          educationOrganizationReference: {
            educationOrganizationId: organization_id.number
          },
          staffReference: {
            staffUniqueId: employee.state_id.number
          },
          beginDate: position.start_date,
          endDate: position.end_date,
          staffClassificationDescriptor: classification_url(classification_descriptors[descriptor])
        }

        response = rest_client_request(:post, url, employee, body: data.to_json)
        next unless response

        edfi_id = response.headers[:location].split('/').last
        position.find_or_build_ed_fi_id.update(
          number: edfi_id,
          endpoint: endpoint,
          school_year: school_year
        )
      end
    end
end
