# frozen_string_literal: true

require "colorize"
require "dry/configurable"
require "dry/files"
require "mem"
require "yaml"

# Mixins
require "mihari/mixins/configurable"
require "mihari/mixins/configuration"
require "mihari/mixins/disallowed_data_value"
require "mihari/mixins/hash"
require "mihari/mixins/refang"
require "mihari/mixins/retriable"
require "mihari/mixins/rule"

def truthy?(value)
  return true if value == "true"
  return true if value == true

  false
end

module Mihari
  extend Dry::Configurable
  extend Mixins::Configuration

  setting :binaryedge_api_key, ENV["BINARYEDGE_API_KEY"]
  setting :censys_id, ENV["CENSYS_ID"]
  setting :censys_secret, ENV["CENSYS_SECRET"]
  setting :circl_passive_password, ENV["CIRCL_PASSIVE_PASSWORD"]
  setting :circl_passive_username, ENV["CIRCL_PASSIVE_USERNAME"]
  setting :ipinfo_api_key, ENV["ipinfo_api_key"]
  setting :misp_api_endpoint, ENV["MISP_API_ENDPOINT"]
  setting :misp_api_key, ENV["MISP_API_KEY"]
  setting :onyphe_api_key, ENV["ONYPHE_API_KEY"]
  setting :otx_api_key, ENV["OTX_API_KEY"]
  setting :passivetotal_api_key, ENV["PASSIVETOTAL_API_KEY"]
  setting :passivetotal_username, ENV["PASSIVETOTAL_USERNAME"]
  setting :pulsedive_api_key, ENV["PULSEDIVE_API_KEY"]
  setting :securitytrails_api_key, ENV["SECURITYTRAILS_API_KEY"]
  setting :shodan_api_key, ENV["SHODAN_API_KEY"]
  setting :slack_channel, ENV["SLACK_CHANNEL"]
  setting :slack_webhook_url, ENV["SLACK_WEBHOOK_URL"]
  setting :spyse_api_key, ENV["SPYSE_API_KEY"]
  setting :thehive_api_endpoint, ENV["THEHIVE_API_ENDPOINT"]
  setting :thehive_api_key, ENV["THEHIVE_API_KEY"]
  setting :urlscan_api_key, ENV["URLSCAN_API_KEY"]
  setting :virustotal_api_key, ENV["VIRUSTOTAL_API_KEY"]
  setting :zoomeye_api_key, ENV["ZOOMEYE_API_KEY"]
  setting :webhook_url, ENV["WEBHOOK_URL"]
  setting(:webhook_use_json_body, ENV["WEBHOOK_USE_JSON_BODY"]) { |value| truthy?(value) }
  setting :database, ENV["DATABASE"] || "mihari.db"

  class << self
    include Mem

    def emitters
      []
    end
    memoize :emitters

    def analyzers
      []
    end
    memoize :analyzers

    #
    # Load configuration from YAML file
    #
    # @param [String] path Path to YAML file
    #
    # @return [nil]
    #
    def load_config_from_yaml(path)
      config = load_config(path)

      # validate loaded yaml data
      validate_config config

      config.each do |key, value|
        Mihari.config.send("#{key.downcase}=".to_sym, value)
      end
    end
  end
end

require "mihari/version"
require "mihari/errors"

require "mihari/database"
require "mihari/type_checker"

# Constraints
require "mihari/constraints"

# Schemas
require "mihari/schemas/analyzer"
require "mihari/schemas/configuration"
require "mihari/schemas/rule"

# Models
require "mihari/models/alert"
require "mihari/models/artifact"
require "mihari/models/tag"
require "mihari/models/tagging"

# Serializers
require "mihari/serializers/alert"
require "mihari/serializers/artifact"
require "mihari/serializers/tag"

# Analyzers
require "mihari/analyzers/base"
require "mihari/analyzers/basic"

require "mihari/analyzers/binaryedge"
require "mihari/analyzers/censys"
require "mihari/analyzers/circl"
require "mihari/analyzers/crtsh"
require "mihari/analyzers/dnpedia"
require "mihari/analyzers/dnstwister"
require "mihari/analyzers/onyphe"
require "mihari/analyzers/otx"
require "mihari/analyzers/passivetotal"
require "mihari/analyzers/pulsedive"
require "mihari/analyzers/securitytrails"
require "mihari/analyzers/shodan"
require "mihari/analyzers/spyse"
require "mihari/analyzers/urlscan"
require "mihari/analyzers/virustotal"
require "mihari/analyzers/zoomeye"

require "mihari/analyzers/rule"

# Notifiers
require "mihari/notifiers/base"
require "mihari/notifiers/slack"
require "mihari/notifiers/exception_notifier"

# Emitters
require "mihari/emitters/base"
require "mihari/emitters/database"
require "mihari/emitters/misp"
require "mihari/emitters/slack"
require "mihari/emitters/stdout"
require "mihari/emitters/the_hive"
require "mihari/emitters/webhook"

# Status checker
require "mihari/status"

# Web app
require "mihari/web/app"

# CLIs
require "mihari/cli/base"

require "mihari/cli/analyzer"
require "mihari/cli/init"

require "mihari/cli/main"