module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private
      def find_verified_user
        # セッションからuser_idを取得してUserを特定する
        # 注: セッションストアの設定に依存するが、CookieStore（デフォルト）を想定

        if verified_user = User.find_by(id: session_user_id)
          verified_user
        else
          reject_unauthorized_connection
        end
      end

      def session_user_id
        # RailsのセッションCookieからuser_idを復元する
        # _dip_front_session は config/initializers/session_store.rb で設定されているキー名、またはデフォルトの _app_session
        # ここでは汎用的に取得を試みる

        session_key = Rails.application.config.session_options[:key]
        encrypted_session = cookies.encrypted[session_key]

        if encrypted_session && encrypted_session["user_id"]
          encrypted_session["user_id"]
        else
          # デバッグ用: 認証失敗時はnilを返す
          nil
        end
      end
  end
end
