class Budgets::Investments::VotesComponent < ApplicationComponent
  attr_reader :investment
  use_helpers :namespace, :current_user, :image_absolute_url, :link_to_verify_account

  def initialize(investment)
    @investment = investment
  end

  def support_path
    case namespace
    when "management"
      management_budget_investment_votes_path(investment.budget, investment)
    else
      budget_investment_votes_path(investment.budget, investment)
    end
  end

  def remove_support_path
    vote = investment.votes_for.find_by!(voter: current_user)

    case namespace
    when "management"
      management_budget_investment_vote_path(investment.budget, investment, vote)
    else
      budget_investment_vote_path(investment.budget, investment, vote)
    end
  end

  private

    def reason
      @reason ||= investment.reason_for_not_being_selectable_by(current_user)
    end

    def voting_allowed?
      reason != :not_voting_allowed
    end

    def user_voted_for?
      @user_voted_for = current_user&.voted_for?(investment) unless defined?(@user_voted_for)
      @user_voted_for
    end

    def display_support_alert?
      current_user &&
        !current_user.voted_in_group?(investment.group) &&
        investment.group.headings.count > investment.group.max_votable_headings
    end

    def confirm_vote_message
      t("budgets.investments.votes.confirm_group", count: investment.group.max_votable_headings)
    end

    def support_aria_label
      t("budgets.investments.votes.support_label", investment: investment.title)
    end

    def remove_support_aria_label
      t("budgets.investments.votes.remove_support_label", investment: investment.title)
    end

    def cannot_vote_text
      if reason.present? && !user_voted_for?
        t("votes.budget_investments.#{reason}",
          count: investment.group.max_votable_headings,
          verify_account: link_to_verify_account,
          supported_headings: current_user && current_user.headings_voted_within_group(investment.group)
                                                          .map(&:name)
                                                          .sort
                                                          .to_sentence)
      end
    end
end
