# frozen_string_literal: true

require "decidim/feature_validator"
require "decidim/comments"

module Decidim
  # Dummy engine to be able to test components.
  class DummyEngine < Rails::Engine
    engine_name "dummy"

    routes do
      root to: proc { [200, {}, ["DUMMY ENGINE"]] }
      resources :dummy_resources, controller: "decidim/dummy_resources"
    end
  end

  class DummyAdminEngine < Rails::Engine
    engine_name "dummy_admin"

    routes do
      root to: proc { [200, {}, ["DUMMY ADMIN ENGINE"]] }
    end
  end

  class DummyResourceEvent < Events::BaseEvent
    include Decidim::Events::EmailEvent
    include Decidim::Events::NotificationEvent
  end

  module DummyResources
    class ApplicationRecord < ActiveRecord::Base
      self.abstract_class = true
    end

    class DummyResource < ApplicationRecord
      include HasFeature
      include Resourceable
      include Reportable
      include Authorable
      include HasCategory
      include HasScope
      include Decidim::Comments::Commentable
      include Followable
      include Traceable
      include Publicable

      feature_manifest_name "dummy"

      def reported_content_url
        ResourceLocatorPresenter.new(self).url
      end
    end
  end

  class DummyResourcesController < ActionController::Base
    helper Decidim::Comments::CommentsHelper
    skip_authorization_check

    def show
      @commentable = DummyResources::DummyResource.find(params[:id])
      render inline: %{
        <%= csrf_meta_tags %>
        <%= display_flash_messages %>
        <div class="reveal" id="loginModal" data-reveal></div>
        <%= javascript_include_tag 'application' %>
        <%= inline_comments_for(@commentable) %>
      }
    end
  end
end

class DummySerializer
  def initialize(id)
    @id = id
  end

  def serialize
    {
      id: @id
    }
  end
end

Decidim.register_feature(:dummy) do |feature|
  feature.engine = Decidim::DummyEngine
  feature.admin_engine = Decidim::DummyAdminEngine
  feature.icon = "decidim/dummy.svg"

  feature.actions = %w(foo bar)

  feature.settings(:global) do |settings|
    settings.attribute :comments_enabled, type: :boolean, default: true
    settings.attribute :dummy_global_attribute_1, type: :boolean
    settings.attribute :dummy_global_attribute_2, type: :boolean
  end

  feature.settings(:step) do |settings|
    settings.attribute :comments_blocked, type: :boolean, default: false
    settings.attribute :dummy_step_attribute_1, type: :boolean
    settings.attribute :dummy_step_attribute_2, type: :boolean
  end

  feature.register_resource do |resource|
    resource.name = :dummy
    resource.model_class_name = "Decidim::DummyResources::DummyResource"
    resource.template = "decidim/dummy_resource/linked_dummys"
  end

  feature.register_stat :dummies_count_high, primary: true, priority: Decidim::StatsRegistry::HIGH_PRIORITY do |features, _start_at, _end_at|
    features.count * 10
  end

  feature.register_stat :dummies_count_medium, primary: true, priority: Decidim::StatsRegistry::MEDIUM_PRIORITY do |features, _start_at, _end_at|
    features.count * 100
  end

  feature.exports :dummies do |exports|
    exports.collection do
      [1, 2, 3]
    end

    exports.serializer DummySerializer
  end
end

RSpec.configure do |config|
  config.before(:suite) do
    ActiveRecord::Migration.suppress_messages do
      unless ActiveRecord::Base.connection.data_source_exists?("decidim_dummy_resources")
        ActiveRecord::Migration.create_table :decidim_dummy_resources do |t|
          t.string :title
          t.text :address
          t.float :latitude
          t.float :longitude
          t.datetime :published_at

          t.references :decidim_feature, index: true
          t.references :decidim_author, index: true
          t.references :decidim_category, index: true
          t.references :decidim_scope, index: true

          t.timestamps
        end
      end
    end
  end

  config.before(:each) do
    Decidim.find_feature_manifest(:dummy).reset_hooks!
  end
end