/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

// Karma configuration file
module.exports = function (config) {
  config.set({
    basePath: "",
    frameworks: ["jasmine", "@angular-devkit/build-angular"],
    plugins: [
      require("karma-jasmine"),
      require("karma-chrome-launcher"),
      require("karma-coverage"),
      require("@angular-devkit/build-angular/plugins/karma")
    ],
    client: {
      clearContext: config.singleRun, // Leave Jasmine Spec Runner output visible in the browser
      jasmine: {
        random: false, // Disable random order for consistent test results
      },
    },
    customLaunchers: {
      ChromeHeadlessCustom: {
        base: "ChromeHeadless",
        flags: [
          "--no-sandbox",
          "--headless",
          "--remote-debugging-port=0",
          "--disable-gpu",
          "--disable-translate",
          "--disable-extensions",
          "--disable-dev-shm-usage", // Avoid /dev/shm issues in CI environments
          "--disable-extensions",
          "--disable-background-networking",
          "--disable-background-timer-throttling",
          "--disable-backgrounding-occluded-windows",
          "--disable-breakpad",
          "--disable-sync",
        ],
      },
    },
    reporters: ["dots", "coverage"], // dots = test progress; coverage = lcov.info for Codecov when --code-coverage is passed
    coverageReporter: {
      dir: require("path").join(__dirname, "./coverage"),
      subdir: ".",
      reporters: [{ type: "lcovonly", file: "lcov.info" }, { type: "text-summary" }]
    },
    port: 9876, // Karma's web server port
    colors: true, // Enable colors in the output (reporters and logs)
    logLevel: config.LOG_INFO, // Set log level
    autoWatch: false, // Disable auto-watch to prevent re-runs in CI
    concurrency: 1, // Launch only one browser at a time
    browsers: ["ChromeHeadlessCustom"], // Run tests in headless Chrome
    singleRun: true, // Ensure Karma exits after running tests once (useful for CI)
    restartOnFileChange: false, // Disable file change restarts in CI
    captureTimeout: 30000, // 30-second timeout for capturing the browser
    browserDisconnectTimeout: 60000, // 60-second disconnect timeout
    browserDisconnectTolerance: 1, // Allow up to 1 disconnect before failing
    browserNoActivityTimeout: 60000, // 60-second no-activity timeout
  });
};
