codeforamerica/michigan-benefits

View on GitHub
app/forms/form_navigation.rb

Summary

Maintainability
A
30 mins
Test Coverage
class FormNavigation
  MAIN = {
    "Welcome" => [
      Integrated::WhichProgramsController,
      Integrated::WelcomeController,
      Integrated::ResideInStateController,
      Integrated::ResideOutOfStateController,
      Integrated::OfficeLocationController,
      Integrated::IntroduceYourselfController,
      Integrated::LivingSituationController,
      Integrated::ResidentialAddressController,
      Integrated::MailingAddressController,
      Integrated::PhoneNumberController,
    ],
    "Household" => [
      Integrated::YourHouseholdController,
      Integrated::HouseholdMembersOverviewController,
    ],
    "Food Assistance" => [
      Integrated::FoodAssistanceController,
      Integrated::BuyAndPrepareFoodWithOtherPersonController,
      Integrated::ShareFoodCostsWithHouseholdController,
      Integrated::BuyAndPrepareFoodSeparatelyController,
      Integrated::ReviewFoodAssistanceMembersController,
    ],
    "Taxes" => [
      Integrated::FileTaxesThisYearController,
      Integrated::ReviewHealthcareHouseholdController,
      Integrated::DescribeTaxRelationshipsController,
    ],
    "Healthcare" => [
      Integrated::HealthcareController,
      Integrated::DeclineHealthcareController,
    ],
    "Household Details" => [
      Integrated::GettingToKnowYouController,
    ],
    "Married" => [
      Integrated::AreYouMarriedController,
      Integrated::AnyoneMarriedController,
      Integrated::WhoIsMarriedController,
    ],
    "Caretaker" => [
      Integrated::AnyoneCaretakerController,
      Integrated::WhoIsCaretakerController,
    ],
    "Student" => [
      Integrated::AreYouStudentController,
      Integrated::AnyoneStudentController,
      Integrated::WhoIsStudentController,
    ],
    "Disabled" => [
      Integrated::AreYouDisabledController,
      Integrated::AnyoneDisabledController,
      Integrated::WhoIsDisabledController,
    ],
    "Veteran" => [
      Integrated::AreYouVeteranController,
      Integrated::AnyoneVeteranController,
      Integrated::WhoIsVeteranController,
    ],
    "Foster" => [
      Integrated::WereYouFosterCareController,
      Integrated::AnyoneFosterCareController,
      Integrated::WhoWasFosterCareController,
    ],
    "Citizen" => [
      Integrated::AreYouCitizenController,
      Integrated::EveryoneCitizenController,
      Integrated::WhoIsNotCitizenController,
      Integrated::ImmigrationInfoController,
    ],
    "Household Expenses" => [
      Integrated::HouseholdBillsController,
      Integrated::HousingExpensesController,
      Integrated::RentDetailsController,
      Integrated::MortgageDetailsController,
      Integrated::MobileHomeLotRentDetailsController,
      Integrated::PropertyTaxDetailsController,
      Integrated::HomeownersInsuranceDetailsController,
      Integrated::LandContractDetailsController,
      Integrated::YourHousingExpensesDetailsController,
      Integrated::UtilityExpensesController,
      Integrated::ChildcareExpensesController,
      Integrated::ChildcareExpensesDetailsController,
      Integrated::DependentCareExpensesController,
      Integrated::DependentCareExpensesDetailsController,
      Integrated::ChildSupportController,
      Integrated::ChildSupportDetailsController,
      Integrated::AlimonyController,
      Integrated::AlimonyDetailsController,
      Integrated::StudentLoanInterestController,
      Integrated::StudentLoanInterestDetailsController,
      Integrated::YourExpensesDetailsController,
    ],
    "Medical Bills and Health Insurance" => [
      Integrated::HealthAndInsuranceController,
      Integrated::AreYouHealthcareEnrolledController,
      Integrated::AnyoneHealthcareEnrolledController,
      Integrated::WhoIsHealthcareEnrolledController,
      Integrated::OngoingMedicalExpensesController,
      Integrated::HealthInsuranceExpensesDetailsController,
      Integrated::CopaysExpensesDetailsController,
      Integrated::PrescriptionsExpensesDetailsController,
      Integrated::TransportationExpensesDetailsController,
      Integrated::DentalExpensesDetailsController,
      Integrated::InHomeCareExpensesDetailsController,
      Integrated::HospitalBillsExpensesDetailsController,
      Integrated::OtherMedicalExpensesDetailsController,
      Integrated::OngoingMedicalExpensesDetailsController,
      Integrated::DoYouHaveMedicalBillsController,
      Integrated::AnyoneHaveMedicalBillsController,
      Integrated::WhoHasMedicalBillsController,
    ],
    "Pregnancy" => [
      Integrated::AreYouPregnantController,
      Integrated::AnyonePregnantController,
      Integrated::WhoIsPregnantController,
      Integrated::HowManyBabiesController,
      Integrated::DoYouHavePregnancyExpensesController,
      Integrated::AnyoneHavePregnancyExpensesController,
      Integrated::WhoHasPregnancyExpensesController,
    ],
    "Flint Water Crisis" => [
      Integrated::AreYouFlintWaterController,
      Integrated::AnyoneFlintWaterController,
      Integrated::WhoIsFlintWaterController,
    ],
    "Income and Employment" => [
      Integrated::IncomeAndEmploymentController,
      Integrated::HasYourIncomeChangedController,
      Integrated::TellUsIncomeChangedController,
      Integrated::DoYouHaveJobController,
      Integrated::HowManyJobsController,
      Integrated::JobDetailsController,
      Integrated::AreYouSelfEmployedController,
      Integrated::AnyoneSelfEmployedController,
      Integrated::WhoIsSelfEmployedController,
      Integrated::SelfEmploymentDetailsController,
      Integrated::IncomeSourcesController,
      Integrated::IncomeSourcesDetailsController,
    ],
    "Savings and Assets" => [
      Integrated::SavingsAndAssetsController,
      Integrated::MoneyInAccountsController,
      Integrated::AmountInAccountsController,
      Integrated::AccountsOverviewController,
      Integrated::VehiclesController,
      Integrated::VehiclesOverviewController,
      Integrated::PropertyController,
    ],
    "Finishing Up" => [
      Integrated::FinishingUpController,
      Integrated::AnythingElseController,
      Integrated::AuthorizedRepController,
      Integrated::TellUsAuthorizedRepController,
      Integrated::ProvideSsnController,
      Integrated::HowElseContactController,
      Integrated::TellUsContactController,
      Integrated::ReviewPaperworkController,
      Integrated::UploadPaperworkController,
      Integrated::LegalAgreementController,
      Integrated::SignSubmitController,
      Integrated::ApplicationSubmittedController,
    ],
  }.freeze

  OFF_MAIN = [
    Integrated::AddHouseholdMemberController,
    Integrated::RemoveHouseholdMemberController,
    Integrated::AddFoodMemberController,
    Integrated::RemoveFoodMemberController,
    Integrated::AddHealthcareMemberController,
    Integrated::RemoveHealthcareMemberController,
    Integrated::AddVehicleController,
    Integrated::RemoveVehicleController,
    Integrated::AddAccountController,
    Integrated::RemoveAccountController,
  ].freeze

  class << self
    delegate :first, to: :form_controllers

    def screens_index
      MAIN
    end

    def form_controllers
      MAIN.values.flatten.freeze
    end

    def all
      (MAIN.values + OFF_MAIN).flatten.freeze
    end
  end

  delegate :form_controllers, to: :class

  def initialize(form_controller)
    @form_controller = form_controller
  end

  def next
    return unless index
    form_controllers_until_end = form_controllers[index + 1..-1]
    seek(form_controllers_until_end)
  end

  def previous
    return unless index
    return if index.zero?
    form_controllers_to_beginning = form_controllers[0..index - 1].reverse
    seek(form_controllers_to_beginning)
  end

  def index
    form_controllers.index(@form_controller.class)
  end

  private

  def seek(list)
    list.detect do |form_controller_class|
      !form_controller_class.skip?(@form_controller.current_application)
    end
  end
end