# frozen_string_literal: true

class PublishedPagesController < ApplicationController

  skip_before_action :preload_json
  skip_before_action :check_xhr, :verify_authenticity_token, only: [:show]
  before_action :ensure_publish_enabled
  before_action :redirect_to_login_if_required, except: [:show]

  def show
    params.require(:slug)

    pp = PublishedPage.find_by(slug: params[:slug])
    raise Discourse::NotFound unless pp

    return if enforce_login_required!

    if !pp.public
      begin
        guardian.ensure_can_see!(pp.topic)
      rescue Discourse::InvalidAccess => e
        return rescue_discourse_actions(
          :invalid_access,
          403,
          include_ember: false,
          custom_message: e.custom_message,
          group: e.group
        )
      end
    end

    @topic = pp.topic
    @canonical_url = @topic.url
    @logo = SiteSetting.logo_small
    @site_url = Discourse.base_url
    @border_color = "#" + ColorScheme.base_colors["tertiary"]

    @body_classes = Set.new([
      'published-page',
      params[:slug],
      "topic-#{@topic.id}",
      @topic.tags.pluck(:name)
    ].flatten.compact)

    if @topic.category
      @body_classes << @topic.category.slug
    end

    render layout: 'publish'
  end

  def details
    pp = PublishedPage.find_by(topic: fetch_topic)
    raise Discourse::NotFound if pp.blank?
    render_serialized(pp, PublishedPageSerializer)
  end

  def upsert
    pp_params = params.require(:published_page)

    result, pp = PublishedPage.publish!(
      current_user,
      fetch_topic,
      pp_params[:slug].strip,
      pp_params.permit(:public)
    )

    json_result(pp, serializer: PublishedPageSerializer) { result }
  end

  def destroy
    PublishedPage.unpublish!(current_user, fetch_topic)
    render json: success_json
  end

  def check_slug
    pp = PublishedPage.new(topic: Topic.new, slug: params[:slug].strip)

    if pp.valid?
      render json: { valid_slug: true }
    else
      render json: { valid_slug: false, reason: pp.errors.full_messages.first }
    end
  end

private

  def fetch_topic
    topic = Topic.find_by(id: params[:topic_id])
    guardian.ensure_can_publish_page!(topic)
    topic
  end

  def ensure_publish_enabled
    raise Discourse::NotFound unless SiteSetting.enable_page_publishing?
  end

  def enforce_login_required!
    if SiteSetting.login_required? &&
       !current_user &&
       !SiteSetting.show_published_pages_login_required? &&
      redirect_to_login
      true
    end
  end

end