class WidgetsController < ActionController::Base
  before_action :set_web_widget
  before_action :set_token
  before_action :set_contact
  before_action :build_contact

  private

  def set_contact
    return if cookie_params[:source_id].nil?

    contact_inbox = ::ContactInbox.find_by(
      inbox_id: @web_widget.inbox.id,
      source_id: cookie_params[:source_id]
    )

    @contact = contact_inbox ? contact_inbox.contact : nil
  end

  def set_token
    @token = conversation_token
  end

  def set_web_widget
    @web_widget = ::Channel::WebWidget.find_by!(website_token: permitted_params[:website_token])
  end

  def build_contact
    return if @contact.present?

    contact_inbox = @web_widget.create_contact_inbox
    @contact = contact_inbox.contact

    payload = {
      source_id: contact_inbox.source_id,
      contact_id: @contact.id,
      inbox_id: @web_widget.inbox.id
    }
    @token = JWT.encode payload, secret_key, 'HS256'
  end

  def cookie_params
    return @cookie_params if @cookie_params.present?

    if conversation_token.present?
      begin
        @cookie_params = JWT.decode(
          conversation_token, secret_key, true, algorithm: 'HS256'
        ).first.symbolize_keys
      rescue StandardError
        @cookie_params = {}
      end
      return @cookie_params
    end
    {}
  end

  def conversation_token
    permitted_params[:cw_conversation]
  end

  def permitted_params
    params.permit(:website_token, :cw_conversation)
  end

  def secret_key
    Rails.application.secrets.secret_key_base
  end
end
