class Cards::CommentsController < ApplicationController
  wrap_parameters :comment, include: %i[ body created_at ]
  include CardScoped

  before_action :set_comment, only: %i[ show edit update destroy ]
  before_action :ensure_creatorship, only: %i[ edit update destroy ]
  before_action :ensure_card_is_commentable, only: :create

  def index
    set_page_and_extract_portion_from @card.comments.chronologically
  end

  def create
    @comment = @card.comments.create!(comment_params)

    respond_to do |format|
      format.turbo_stream
      format.json { render :show, status: :created, location: card_comment_path(@card, @comment, format: :json) }
    end
  end

  def show
  end

  def edit
  end

  def update
    @comment.update! comment_params

    respond_to do |format|
      format.turbo_stream
      format.json { head :no_content }
    end
  end

  def destroy
    @comment.destroy

    respond_to do |format|
      format.turbo_stream
      format.json { head :no_content }
    end
  end

  private
    def set_comment
      @comment = @card.comments.find(params[:id])
    end

    def ensure_creatorship
      head :forbidden if Current.user != @comment.creator
    end

    def ensure_card_is_commentable
      head :forbidden unless @card.commentable?
    end

    def comment_params
      params.expect(comment: [ :body, :created_at ])
    end
end
