# frozen_string_literal: true

class PublishedPage < ActiveRecord::Base
  belongs_to :topic

  validates_presence_of :slug
  validates_uniqueness_of :slug, :topic_id

  validate :slug_format
  def slug_format
    if slug !~ /\A[a-zA-Z\-\_0-9]+\z/
      errors.add(:slug, I18n.t("publish_page.slug_errors.invalid"))
    elsif %w[check-slug by-topic].include?(slug)
      errors.add(:slug, I18n.t("publish_page.slug_errors.unavailable"))
    end
  end

  def path
    "/pub/#{slug}"
  end

  def url
    "#{Discourse.base_url}#{path}"
  end

  def self.publish!(publisher, topic, slug, options = {})
    pp = nil

    results =
      transaction do
        pp = find_or_initialize_by(topic: topic)
        pp.slug = slug.strip
        pp.public = options[:public] || false

        if pp.save
          StaffActionLogger.new(publisher).log_published_page(topic.id, slug)
          [true, pp]
        end
      end

    results || [false, pp]
  end

  def self.unpublish!(publisher, topic)
    if pp = PublishedPage.find_by(topic_id: topic.id)
      pp.destroy!
      StaffActionLogger.new(publisher).log_unpublished_page(topic.id, pp.slug)
    end
  end
end

# == Schema Information
#
# Table name: published_pages
#
#  id         :bigint           not null, primary key
#  topic_id   :bigint           not null
#  slug       :string           not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#  public     :boolean          default(FALSE), not null
#
# Indexes
#
#  index_published_pages_on_slug      (slug) UNIQUE
#  index_published_pages_on_topic_id  (topic_id) UNIQUE
#