#pragma once

#include <scwx/wsr88d/rda/level2_message.hpp>

namespace scwx::wsr88d::rda
{

class RdaAdaptationData : public Level2Message
{
public:
   explicit RdaAdaptationData();
   ~RdaAdaptationData();

   RdaAdaptationData(const RdaAdaptationData&)            = delete;
   RdaAdaptationData& operator=(const RdaAdaptationData&) = delete;

   RdaAdaptationData(RdaAdaptationData&&) noexcept;
   RdaAdaptationData& operator=(RdaAdaptationData&&) noexcept;

   [[nodiscard]] std::string   adap_file_name() const;
   [[nodiscard]] std::string   adap_format() const;
   [[nodiscard]] std::string   adap_revision() const;
   [[nodiscard]] std::string   adap_date() const;
   [[nodiscard]] std::string   adap_time() const;
   [[nodiscard]] float         lower_pre_limit() const;
   [[nodiscard]] float         az_lat() const;
   [[nodiscard]] float         upper_pre_limit() const;
   [[nodiscard]] float         el_lat() const;
   [[nodiscard]] float         parkaz() const;
   [[nodiscard]] float         parkel() const;
   [[nodiscard]] float         a_fuel_conv(unsigned i) const;
   [[nodiscard]] float         a_min_shelter_temp() const;
   [[nodiscard]] float         a_max_shelter_temp() const;
   [[nodiscard]] float         a_min_shelter_ac_temp_diff() const;
   [[nodiscard]] float         a_max_xmtr_air_temp() const;
   [[nodiscard]] float         a_max_rad_temp() const;
   [[nodiscard]] float         a_max_rad_temp_rise() const;
   [[nodiscard]] float         lower_dead_limit() const;
   [[nodiscard]] float         upper_dead_limit() const;
   [[nodiscard]] float         a_min_gen_room_temp() const;
   [[nodiscard]] float         a_max_gen_room_temp() const;
   [[nodiscard]] float         spip_5v_reg_lim() const;
   [[nodiscard]] float         spip_15v_reg_lim() const;
   [[nodiscard]] bool          rpg_co_located() const;
   [[nodiscard]] bool          spec_filter_installed() const;
   [[nodiscard]] bool          tps_installed() const;
   [[nodiscard]] bool          rms_installed() const;
   [[nodiscard]] std::uint32_t a_hvdl_tst_int() const;
   [[nodiscard]] std::uint32_t a_rpg_lt_int() const;
   [[nodiscard]] std::uint32_t a_min_stab_util_pwr_time() const;
   [[nodiscard]] std::uint32_t a_gen_auto_exer_interval() const;
   [[nodiscard]] std::uint32_t a_util_pwr_sw_req_interval() const;
   [[nodiscard]] float         a_low_fuel_level() const;
   [[nodiscard]] std::uint32_t config_chan_number() const;
   [[nodiscard]] std::uint32_t redundant_chan_config() const;
   [[nodiscard]] float         atten_table(unsigned i) const;
   [[nodiscard]] float         path_losses(unsigned i) const;
   [[nodiscard]] float         h_coupler_xmt_loss() const;
   [[nodiscard]] float         h_coupler_cw_loss() const;
   [[nodiscard]] float         v_coupler_xmt_loss() const;
   [[nodiscard]] float         ame_ts_bias() const;
   [[nodiscard]] float         v_coupler_cw_loss() const;
   [[nodiscard]] float         pwr_sense_bias() const;
   [[nodiscard]] float         ame_v_noise_enr() const;
   [[nodiscard]] float         chan_cal_diff() const;
   [[nodiscard]] float         v_ts_cw() const;
   [[nodiscard]] float         h_rnscale(unsigned i) const;
   [[nodiscard]] float         atmos(unsigned i) const;
   [[nodiscard]] float         el_index(unsigned i) const;
   [[nodiscard]] std::uint32_t tfreq_mhz() const;
   [[nodiscard]] float         base_data_tcn() const;
   [[nodiscard]] float         refl_data_tover() const;
   [[nodiscard]] float         tar_h_dbz0_lp() const;
   [[nodiscard]] float         tar_v_dbz0_lp() const;
   [[nodiscard]] std::uint32_t init_phi_dp() const;
   [[nodiscard]] std::uint32_t norm_init_phi_dp() const;
   [[nodiscard]] float         lx_lp() const;
   [[nodiscard]] float         lx_sp() const;
   [[nodiscard]] float         meteor_param() const;
   [[nodiscard]] float         antenna_gain() const;
   [[nodiscard]] float         vel_degrad_limit() const;
   [[nodiscard]] float         wth_degrad_limit() const;
   [[nodiscard]] float         h_noisetemp_dgrad_limit() const;
   [[nodiscard]] std::uint32_t h_min_noisetemp() const;
   [[nodiscard]] float         v_noisetemp_dgrad_limit() const;
   [[nodiscard]] std::uint32_t v_min_noisetemp() const;
   [[nodiscard]] float         kly_degrade_limit() const;
   [[nodiscard]] float         ts_coho() const;
   [[nodiscard]] float         h_ts_cw() const;
   [[nodiscard]] float         ts_stalo() const;
   [[nodiscard]] float         ame_h_noise_enr() const;
   [[nodiscard]] float         xmtr_peak_pwr_high_limit() const;
   [[nodiscard]] float         xmtr_peak_pwr_low_limit() const;
   [[nodiscard]] float         h_dbz0_delta_limit() const;
   [[nodiscard]] float         threshold1() const;
   [[nodiscard]] float         threshold2() const;
   [[nodiscard]] float         clut_supp_dgrad_lim() const;
   [[nodiscard]] float         range0_value() const;
   [[nodiscard]] float         xmtr_pwr_mtr_scale() const;
   [[nodiscard]] float         v_dbz0_delta_limit() const;
   [[nodiscard]] float         tar_h_dbz0_sp() const;
   [[nodiscard]] float         tar_v_dbz0_sp() const;
   [[nodiscard]] std::uint32_t deltaprf() const;
   [[nodiscard]] std::uint32_t tau_sp() const;
   [[nodiscard]] std::uint32_t tau_lp() const;
   [[nodiscard]] std::uint32_t nc_dead_value() const;
   [[nodiscard]] std::uint32_t tau_rf_sp() const;
   [[nodiscard]] std::uint32_t tau_rf_lp() const;
   [[nodiscard]] float         seg1_lim() const;
   [[nodiscard]] float         slatsec() const;
   [[nodiscard]] float         slonsec() const;
   [[nodiscard]] std::uint32_t slatdeg() const;
   [[nodiscard]] std::uint32_t slatmin() const;
   [[nodiscard]] std::uint32_t slondeg() const;
   [[nodiscard]] std::uint32_t slonmin() const;
   [[nodiscard]] char          slatdir() const;
   [[nodiscard]] char          slondir() const;
   [[nodiscard]] double        dig_rcvr_clock_freq() const;
   [[nodiscard]] double        coho_freq() const;
   [[nodiscard]] float         az_correction_factor() const;
   [[nodiscard]] float         el_correction_factor() const;
   [[nodiscard]] std::string   site_name() const;
   [[nodiscard]] float         ant_manual_setup_ielmin() const;
   [[nodiscard]] float         ant_manual_setup_ielmax() const;
   [[nodiscard]] std::uint32_t ant_manual_setup_fazvelmax() const;
   [[nodiscard]] std::uint32_t ant_manual_setup_felvelmax() const;
   [[nodiscard]] std::int32_t  ant_manual_setup_ignd_hgt() const;
   [[nodiscard]] std::uint32_t ant_manual_setup_irad_hgt() const;
   [[nodiscard]] float         az_pos_sustain_drive() const;
   [[nodiscard]] float         az_neg_sustain_drive() const;
   [[nodiscard]] float         az_nom_pos_drive_slope() const;
   [[nodiscard]] float         az_nom_neg_drive_slope() const;
   [[nodiscard]] float         az_feedback_slope() const;
   [[nodiscard]] float         el_pos_sustain_drive() const;
   [[nodiscard]] float         el_neg_sustain_drive() const;
   [[nodiscard]] float         el_nom_pos_drive_slope() const;
   [[nodiscard]] float         el_nom_neg_drive_slope() const;
   [[nodiscard]] float         el_feedback_slope() const;
   [[nodiscard]] float         el_first_slope() const;
   [[nodiscard]] float         el_second_slope() const;
   [[nodiscard]] float         el_third_slope() const;
   [[nodiscard]] float         el_droop_pos() const;
   [[nodiscard]] float         el_off_neutral_drive() const;
   [[nodiscard]] float         az_intertia() const;
   [[nodiscard]] float         el_inertia() const;
   [[nodiscard]] float         az_stow_angle() const;
   [[nodiscard]] float         el_stow_angle() const;
   [[nodiscard]] float         az_encoder_alignment() const;
   [[nodiscard]] float         el_encoder_alignment() const;
   [[nodiscard]] std::string   refined_park() const;
   [[nodiscard]] std::uint32_t rvp8nv_iwaveguide_length() const;
   [[nodiscard]] float         v_rnscale(unsigned i) const;
   [[nodiscard]] float         vel_data_tover() const;
   [[nodiscard]] float         width_data_tover() const;
   [[nodiscard]] float         doppler_range_start() const;
   [[nodiscard]] std::uint32_t max_el_index() const;
   [[nodiscard]] float         seg2_lim() const;
   [[nodiscard]] float         seg3_lim() const;
   [[nodiscard]] float         seg4_lim() const;
   [[nodiscard]] std::uint32_t nbr_el_segments() const;
   [[nodiscard]] float         h_noise_long() const;
   [[nodiscard]] float         ant_noise_temp() const;
   [[nodiscard]] float         h_noise_short() const;
   [[nodiscard]] float         h_noise_tolerance() const;
   [[nodiscard]] float         min_h_dyn_range() const;
   [[nodiscard]] bool          gen_installed() const;
   [[nodiscard]] bool          gen_exercise() const;
   [[nodiscard]] float         v_noise_tolerance() const;
   [[nodiscard]] float         min_v_dyn_range() const;
   [[nodiscard]] float         zdr_offset_dgrad_lim() const;
   [[nodiscard]] float         baseline_zdr_offset() const;
   [[nodiscard]] float         v_noise_long() const;
   [[nodiscard]] float         v_noise_short() const;
   [[nodiscard]] float         zdr_data_tover() const;
   [[nodiscard]] float         phi_data_tover() const;
   [[nodiscard]] float         rho_data_tover() const;
   [[nodiscard]] float         stalo_power_dgrad_limit() const;
   [[nodiscard]] float         stalo_power_maint_limit() const;
   [[nodiscard]] float         min_h_pwr_sense() const;
   [[nodiscard]] float         min_v_pwr_sense() const;
   [[nodiscard]] float         h_pwr_sense_offset() const;
   [[nodiscard]] float         v_pwr_sense_offset() const;
   [[nodiscard]] float         ps_gain_ref() const;
   [[nodiscard]] float         rf_pallet_broad_loss() const;
   [[nodiscard]] float         ame_ps_tolerance() const;
   [[nodiscard]] float         ame_max_temp() const;
   [[nodiscard]] float         ame_min_temp() const;
   [[nodiscard]] float         rcvr_mod_max_temp() const;
   [[nodiscard]] float         rcvr_mod_min_temp() const;
   [[nodiscard]] float         bite_mod_max_temp() const;
   [[nodiscard]] float         bite_mod_min_temp() const;
   [[nodiscard]] std::uint32_t default_polarization() const;
   [[nodiscard]] float         tr_limit_dgrad_limit() const;
   [[nodiscard]] float         tr_limit_fail_limit() const;
   [[nodiscard]] bool          rfp_stepper_enabled() const;
   [[nodiscard]] float         ame_current_tolerance() const;
   [[nodiscard]] std::uint32_t h_only_polarization() const;
   [[nodiscard]] std::uint32_t v_only_polarization() const;
   [[nodiscard]] float         sun_bias() const;
   [[nodiscard]] float         a_min_shelter_temp_warn() const;
   [[nodiscard]] float         power_meter_zero() const;
   [[nodiscard]] float         txb_baseline() const;
   [[nodiscard]] float         txb_alarm_thresh() const;

   bool Parse(std::istream& is) override;

   static std::shared_ptr<RdaAdaptationData>
   Create(Level2MessageHeader&& header, std::istream& is);

private:
   class Impl;
   std::unique_ptr<Impl> p;
};

} // namespace scwx::wsr88d::rda
