# frozen_string_literal: true

class Api::V1::ChatMessagesController < Api::BaseController
  before_action -> { authorize_if_got_token! :read, :'read:chats' }
  before_action -> { doorkeeper_authorize! :write, :'write:chats' }

  before_action :require_user!
  before_action :set_chat_conversation, only: :create
  before_action :set_chat_conversation_recipients, only: :create

  def create
    @chat = ChatMessage.create!(
      from_account: current_account,
      chat_conversation: @chat_conversation,
      text: ActionController::Base.helpers.strip_tags(params[:text])
    )

    # : todo :
    # check if blocked

    @chat_conversation_recipients.each do |account|
      payload = InlineRenderer.render(@chat, account, :chat_message)
      Redis.current.publish("chat_messages:#{account.id}", Oj.dump(event: :notification, payload: payload))
    end

    render json: @chat, serializer: REST::ChatMessageSerializer
  end

  def destroy
    puts "tilly destry chat"
    
    @chat = ChatMessage.where(from_account: current_user.account).find(params[:id])

    puts "tilly @chat: " + @chat.inspect

    # : todo :
    # make sure last_chat_message_id in chat_account_conversation gets set to last

    @chat.destroy!

    render json: @chat, serializer: REST::ChatMessageSerializer
  end

  private

  def set_chat_conversation
    @chat_conversation = ChatConversation.find(params[:chat_conversation_id])
  end

  def set_chat_conversation_recipients
    account_conversation = ChatConversationAccount.where(account: current_user.account, chat_conversation: @chat_conversation).first
    puts "tilly account_conversation - " + account_conversation.inspect
    @chat_conversation_recipients = Account.where(id: account_conversation.participant_account_ids)
  end

  def chat_params
    params.permit(:text, :chat_conversation_id)
  end

end