# frozen_string_literal: true

class CustomWizard::Field
  include ActiveModel::SerializerSupport

  attr_reader :raw,
              :id,
              :type,
              :required,
              :value,
              :description,
              :image,
              :image_upload_id,
              :validations,
              :min_length,
              :max_length,
              :char_counter,
              :file_types,
              :format,
              :limit,
              :property,
              :content,
              :tag_groups,
              :category,
              :can_create_tag,
              :preview_template,
              :placeholder

  attr_accessor :index, :step

  REQUIRES_USER = %w[upload]

  def initialize(attrs)
    @raw = attrs || {}
    @id = attrs[:id]
    @index = attrs[:index]
    @type = attrs[:type]
    @required = !!attrs[:required]
    @value = attrs[:value] || default_value
    @description = attrs[:description]
    @image = attrs[:image]
    @validations = attrs[:validations]
    @min_length = attrs[:min_length]
    @max_length = attrs[:max_length]
    @char_counter = attrs[:char_counter]
    @file_types = attrs[:file_types]
    @format = attrs[:format]
    @limit = attrs[:limit]
    @property = attrs[:property]
    @content = attrs[:content]
    @tag_groups = attrs[:tag_groups]
    @category = attrs[:category]
    @can_create_tag = attrs[:can_create_tag]
    @preview_template = attrs[:preview_template]
    @placeholder = attrs[:placeholder]
  end

  def label
    @label ||= PrettyText.cook(@raw[:label])
  end

  def default_value
    false if @type == "checkbox"
  end

  def self.types
    @types ||= {
      text: {
        min_length: nil,
        max_length: nil,
        prefill: nil,
        char_counter: nil,
        validations: nil,
        placeholder: nil,
      },
      textarea: {
        min_length: nil,
        max_length: nil,
        prefill: nil,
        char_counter: nil,
        placeholder: nil,
      },
      composer: {
        min_length: nil,
        max_length: nil,
        char_counter: nil,
        placeholder: nil,
      },
      text_only: {
      },
      composer_preview: {
        preview_template: nil,
      },
      date: {
        format: "YYYY-MM-DD",
      },
      time: {
        format: "HH:mm",
      },
      date_time: {
        format: "",
      },
      number: {
      },
      checkbox: {
      },
      url: {
        min_length: nil,
      },
      upload: {
        file_types: ".jpg,.jpeg,.png",
      },
      dropdown: {
        prefill: nil,
        content: nil,
      },
      tag: {
        limit: nil,
        prefill: nil,
        content: nil,
        tag_groups: nil,
        can_create_tag: false,
      },
      category: {
        limit: 1,
        property: "id",
        prefill: nil,
        content: nil,
      },
      topic: {
        limit: 1,
        prefill: nil,
        content: nil,
        category: nil,
      },
      group: {
        prefill: nil,
        content: nil,
      },
      user_selector: {
      },
    }
  end

  def self.require_assets
    Rails.logger.warn(
      "Custom Wizard field regisration no longer requires asset registration. Support will be removed in v2.1.0.",
    )

    @require_assets ||= {}
  end

  def self.register(type, plugin = nil, opts = {}, legacy_opts = {})
    if opts.is_a?(Array)
      Rails.logger.warn(
        "Custom Wizard field regisration no longer requires asset registration. Support will be removed in v2.1.0.",
      )

      require_assets[plugin] = opts
      opts = legacy_opts
    end

    if type
      types[type.to_sym] ||= {}
      types[type.to_sym] = opts[:type_opts] if opts[:type_opts].present?
    end
  end
end
