# frozen_string_literal: true

FactoryBot.define do
  factory :clusters_applications_helm, class: 'Clusters::Applications::Helm' do
    cluster factory: %i(cluster provided_by_gcp)

    before(:create) do
      allow(Gitlab::Kubernetes::Helm::V2::Certificate).to receive(:generate_root)
        .and_return(
          double(
            key_string: File.read(Rails.root.join('spec/fixtures/clusters/sample_key.key')),
            cert_string: File.read(Rails.root.join('spec/fixtures/clusters/sample_cert.pem'))
          )
        )
    end

    after(:create) do
      allow(Gitlab::Kubernetes::Helm::V2::Certificate).to receive(:generate_root).and_call_original
    end

    trait :not_installable do
      status { -2 }
    end

    trait :errored do
      status { -1 }
      status_reason { 'something went wrong' }
    end

    trait :installable do
      status { 0 }
    end

    trait :scheduled do
      status { 1 }
    end

    trait :installing do
      status { 2 }
    end

    trait :installed do
      status { 3 }
    end

    trait :updating do
      status { 4 }
    end

    trait :updated do
      status { 5 }
    end

    trait :update_errored do
      status { 6 }
      status_reason { 'something went wrong' }
    end

    trait :uninstalling do
      status { 7 }
    end

    trait :uninstall_errored do
      status { 8 }
      status_reason { 'something went wrong' }
    end

    trait :uninstalled do
      status { 10 }
    end

    trait :timed_out do
      installing
      updated_at { ClusterWaitForAppInstallationWorker::TIMEOUT.ago }
    end

    factory :clusters_applications_ingress, class: 'Clusters::Applications::Ingress' do
      modsecurity_enabled { false }
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end

      trait :modsecurity_blocking do
        modsecurity_enabled { true }
        modsecurity_mode { :blocking }
      end

      trait :modsecurity_logging do
        modsecurity_enabled { true }
        modsecurity_mode { :logging }
      end

      trait :modsecurity_disabled do
        modsecurity_enabled { false }
      end

      trait :modsecurity_not_installed do
        modsecurity_enabled { nil }
      end
    end

    factory :clusters_applications_cert_manager, class: 'Clusters::Applications::CertManager' do
      email { 'admin@example.com' }
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_elastic_stack, class: 'Clusters::Applications::ElasticStack' do
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_crossplane, class: 'Clusters::Applications::Crossplane' do
      stack { 'gcp' }
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_prometheus, class: 'Clusters::Applications::Prometheus' do
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_runner, class: 'Clusters::Applications::Runner' do
      runner factory: %i(ci_runner)
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_knative, class: 'Clusters::Applications::Knative' do
      hostname { 'example.com' }
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_jupyter, class: 'Clusters::Applications::Jupyter' do
      oauth_application factory: :oauth_application
      cluster factory: %i(cluster with_installed_helm provided_by_gcp project)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_fluentd, class: 'Clusters::Applications::Fluentd' do
      host { 'example.com' }
      waf_log_enabled { true }
      cilium_log_enabled { true }
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end

    factory :clusters_applications_cilium, class: 'Clusters::Applications::Cilium' do
      cluster factory: %i(cluster with_installed_helm provided_by_gcp)

      trait :no_helm_installed do
        cluster factory: %i(cluster provided_by_gcp)
      end
    end
  end
end
