module Dalmatian
  class Rds
    def initialize(cluster:, reference:)
      @cluster = cluster
      @reference = reference
    end

    attr_reader :cluster, :reference

    def identifier
      reference["identifier"]
    end

    def in_use_by
      reference["in_use_by"] || []
    end

    def clusters_in_use
      clusters_in_use = {}
      cluster_environments.each do |env_name, _env_config|
        clusters_in_use[env_name] = []
        services.each do |service|
          in_use_by.each do |service_name|
            next if service.name != service_name
            clusters_in_use[env_name] << if service.launch_on_cluster.empty?
              "default_dalmatian_ecs_cluster"
            else
              service.launch_on_cluster
            end
          end
        end
        if in_use_by.empty?
          clusters_in_use[env_name] << "default_dalmatian_ecs_cluster" ## fails SimpleCov
        end
        clusters_in_use[env_name] = clusters_in_use[env_name].uniq
      end
      clusters_in_use
    end

    def instance_class
      instance_class = {}
      reference["instance_class"] = {} if reference["instance_class"].nil?
      cluster_environments.each do |env_name, _env_config|
        instance_class[env_name] = reference["instance_class"][env_name] || ""
      end
      instance_class
    end

    def engine
      reference["engine"]
    end

    def engine_version
      reference["engine_version"]
    end

    def allocated_storage
      reference["allocated_storage"] || ""
    end

    def storage_encrypted
      reference["storage_encrypted"].nil? || reference["storage_encrypted"]
    end

    def storage_type
      reference["storage_type"] || "gp3"
    end

    def db_name
      reference["db_name"]
    end

    def port
      reference["port"] || ""
    end

    def maintenance_window
      reference["maintenance_window"] || ""
    end

    def backup_window
      reference["backup_window"] || ""
    end

    def backup_retention_period
      reference["backup_retention_period"] || ""
    end

    def force_ssl
      reference["force_ssl"] || "false"
    end

    def parameter_store_path_db_url_name
      reference["parameter_store_path_db_url_name"] || ""
    end

    def sql_backup_scheduled_task_environment_variables
      reference["sql_backup_scheduled_task_environment_variables"] || []
    end

    def check_sql_backup_scheduled_task_environment_variables
      reference["check_sql_backup_scheduled_task_environment_variables"] || []
    end

    def sync_sql_backup_to_azure
      reference["sync_sql_backup_to_azure"] || false
    end

    def replication_bucket_destination_arn
      reference["replication_bucket_destination_arn"] || ""
    end

    def replication_kms_key_id
      reference["replication_kms_key_id"] || ""
    end

    def codebuild_access
      reference["codebuild_access"] || []
    end

    def cluster_id
      cluster.id
    end

    def cluster_environments
      cluster.environments
    end

    def account_id
      cluster.account_id
    end

    def services
      cluster.services
    end

    def to_params
      {
        "identifier" => identifier,
        "in_use_by" => in_use_by,
        "clusters_in_use" => clusters_in_use,
        "instance_class" => instance_class,
        "engine" => engine,
        "engine_version" => engine_version,
        "allocated_storage" => allocated_storage,
        "storage_encrypted" => storage_encrypted,
        "storage_type" => storage_type,
        "db_name" => db_name,
        "port" => port,
        "maintenance_window" => maintenance_window,
        "backup_window" => backup_window,
        "backup_retention_period" => backup_retention_period,
        "force_ssl" => force_ssl,
        "parameter_store_path_db_url_name" => parameter_store_path_db_url_name,
        "sql_backup_scheduled_task_environment_variables" => sql_backup_scheduled_task_environment_variables,
        "check_sql_backup_scheduled_task_environment_variables" => check_sql_backup_scheduled_task_environment_variables,
        "sync_sql_backup_to_azure" => sync_sql_backup_to_azure,
        "replication_bucket_destination_arn" => replication_bucket_destination_arn,
        "replication_kms_key_id" => replication_kms_key_id,
        "codebuild_access" => codebuild_access
      }
    end
  end
end
