class EdFi::Indiana::V2026::StaffService < EdFi::Indiana::V2026::ApplicationService
  def call
    employees.decorate.each { |e| props(e) }
  end

  def endpoint
    'ed-fi/staffs'
  end

  private
    def employees
      school.employees
        .preload(:state_id, :detail, :race, :title, recent_position: :position)
        .joins(:positions, :state_id)
        .position_within_date_range(semester_range)
    end

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

    def props(employee)
      recent_position = employee.recent_position
      return if recent_position.position.edfi_id.blank?

      descriptor = 'uri://doe.in.gov/StaffIdentificationSystemDescriptor#Last4SSN'
      data = {
        staffUniqueId: employee.state_id.number,
        personalTitlePrefix: employee.title_name,
        firstName: employee.first_name,
        middleName: employee.middle_name,
        lastSurname: employee.last_name,
        generationCodeSuffix: employee.suffix,
        sexDescriptor: "uri://ed-fi.org/SexDescriptor##{employee.gender_label}",
        birthDate: employee.date_of_birth,
        hispanicLatinoEthnicity: employee.hispanic?,
        identificationCodes: [{
          staffIdentificationSystemDescriptor: descriptor,
          identificationCode: employee.social_security_number_number
        }],
        races: employee_races(employee),
        electronicMails: [{
          electronicMailTypeDescriptor: 'uri://ed-fi.org/ElectronicMailTypeDescriptor#Work',
          electronicMailAddress: employee.email
        }]
      }

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

    def employee_races(employee)
      doe_descriptors = ['Hispanic Ethnicity and of any race', 'Multiracial (two or more races)']
      [
        { raceDescriptor:
          if doe_descriptors.include?(race_descriptors[employee.race_id])
            "uri://doe.in.gov/RaceDescriptor##{race_descriptors[employee.race_id]}"
          else
            "uri://ed-fi.org/RaceDescriptor##{race_descriptors[employee.race_id]}"
          end
        }
      ]
    end

    def race_descriptors
      @race_descriptors ||= EdFi::Descriptor
        .by_race_descriptor(school)
        .map { |r| [r.key, r.code] }
        .to_h
    end
end
