codeforamerica/michigan-benefits

View on GitHub
app/steps/medicaid/step_navigation.rb

Summary

Maintainability
A
1 hr
Test Coverage
module Medicaid
  class StepNavigation
    ALL = {
      "Introduction" => [
        Medicaid::WelcomeController,
        Medicaid::IntroLocationController,
        Medicaid::IntroLocationHelpController,
        Medicaid::OfficeLocationController,
        Medicaid::IntroNameController,
        Medicaid::IntroAppliedBeforeController,
        Medicaid::IntroHouseholdController,
        Medicaid::IntroMaritalStatusController,
        Medicaid::IntroMaritalStatusMemberController,
        Medicaid::IntroMaritalStatusIndicateSpouseController,
        Medicaid::IntroCollegeController,
        Medicaid::IntroCollegeMemberController,
        Medicaid::IntroCitizenController,
        Medicaid::IntroCitizenMemberController,
        Medicaid::IntroCaretakerController,
        Medicaid::IntroCaretakerMemberController,
      ],
      "Insurance" => [
        Medicaid::HealthIntroductionController,
        Medicaid::InsuranceNeededController,
        Medicaid::InsuranceCurrentController,
        Medicaid::InsuranceCurrentMemberController,
        Medicaid::InsuranceCurrentTypeController,
        Medicaid::InsuranceMedicalExpensesController,
      ],
      "Health" => [
        Medicaid::HealthDisabilityController,
        Medicaid::HealthDisabilityMemberController,
        Medicaid::HealthPregnancyController,
        Medicaid::HealthPregnancyMemberController,
        Medicaid::HealthFlintWaterCrisisController,
        Medicaid::HealthFlintWaterCrisisConfirmationController,
      ],
      "Taxes" => [
        Medicaid::TaxIntroductionController,
        Medicaid::TaxFilingController,
        Medicaid::TaxClaimedAsDependentController,
        Medicaid::TaxFilingWithHouseholdMembersController,
        Medicaid::TaxFilingWithHouseholdMembersMemberController,
        Medicaid::TaxFilingWithHouseholdMembersRelationshipController,
        Medicaid::TaxOverviewController,
      ],
      "Income" => [
        Medicaid::IncomeIntroductionController,
        Medicaid::IncomeJobController,
        Medicaid::IncomeJobNumberController,
        Medicaid::IncomeJobNumberContinuedController,
        Medicaid::IncomeJobNumberMemberController,
        Medicaid::IncomeSelfEmploymentController,
        Medicaid::IncomeSelfEmploymentMemberController,
        Medicaid::IncomeOtherIncomeController,
        Medicaid::IncomeOtherIncomeMemberController,
        Medicaid::IncomeOtherIncomeTypeController,
      ],
      "Expenses" => [
        Medicaid::ExpensesAlimonyController,
        Medicaid::ExpensesAlimonyMemberController,
        Medicaid::ExpensesStudentLoanController,
        Medicaid::ExpensesStudentLoanMemberController,
      ],
      "Income & Expense Amounts" => [
        Medicaid::AmountsOverviewController,
        Medicaid::AmountsIncomeController,
        Medicaid::AmountsExpensesController,
      ],
      "Contact" => [
        Medicaid::ContactIntroductionController,
        Medicaid::ContactController,
        Medicaid::ContactHomeAddressController,
        Medicaid::ContactOtherAddressController,
        Medicaid::ContactMailingAddressController,
        Medicaid::ContactPhoneController,
        Medicaid::ContactTextMessagesController,
        Medicaid::ContactEmailController,
        Medicaid::ContactSsIntroController,
        Medicaid::ContactSocialSecurityController,
      ],
      "Finishing Up" => [
        Medicaid::PaperworkAndLegalIntroductionController,
      ],
      "Paperwork Guide" => [
        Medicaid::PaperworkIdentificationController,
        Medicaid::PaperworkIncomeProofController,
      ],
      "Paperwork" => [
        Medicaid::PaperworkGuideController,
        Medicaid::PaperworkController,
      ],
      "Legal" => [
        Medicaid::LegalAgreementController,
        Medicaid::SignAndSubmitController,
      ],
      "Success" => [
        Medicaid::SuccessController,
      ],
    }.freeze

    SUBSTEPS = {
      Medicaid::IntroHouseholdMemberController =>
        Medicaid::IntroHouseholdController,
      Medicaid::IntroHouseholdRemoveMemberController =>
        Medicaid::IntroHouseholdController,
    }.freeze

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

      def sections
        ALL
      end

      def steps
        @steps ||= ALL.values.flatten.freeze
      end

      def steps_and_substeps
        @steps_and_substeps ||= (steps + SUBSTEPS.keys).uniq.freeze
      end
    end

    delegate :steps, to: :class

    def initialize(step_instance_or_class)
      @step =
        if step_instance_or_class.is_a?(Class)
          step_instance_or_class
        else
          step_instance_or_class.class
        end
    end

    def next
      step_at(1)
    end

    def skip
      step_at(2)
    end

    def previous
      step_at(-1)
    end

    def index
      steps.index(@step)
    end

    def parent
      self.class.new(SUBSTEPS[@step])
    end

    private

    def step_at(increment)
      if index
        new_index = index + increment
        new_index = nil if new_index.negative? || new_index >= steps.length
      else
        new_index = parent.index
      end

      steps.at(new_index) if new_index
    end
  end
end