// Copyright 2025 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only

import { assert } from 'chai';
import { _isFeatureEnabledInner } from '../../util/isFeatureEnabled.dom.ts';

const isTestEnvironment = () => false;

describe('isFeatureEnabled', () => {
  it('returns false if nothing triggers', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if current version is invalid semver', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'broken',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if internal', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.1.0',
        isInternalUser: true,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if isAlpha', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0-alpha.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if isStaging', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0-staging.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if isTestEnvironment', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0',
        isInternalUser: false,
        isTestEnvironment: () => true,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if beta and beta version is greater', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v2.0.0-beta.2',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if beta and beta version is equal', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v2.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if beta and beta version is lesser', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if beta and no beta value', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: undefined,
        currentVersion: 'v1.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if beta and beta value is not valid semver', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'broken',
        currentVersion: 'v1.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });

  it('returns true if prod and prod version is greater', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v2.0.0',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns true if prod and prod version is equal', async () => {
    assert.isTrue(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.1.0',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if prod and prod version is lesser', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'v1.1.0',
      })
    );
  });
  it('returns false if prod and no prod value', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: undefined,
      })
    );
  });
  it('returns false if prod and prod value is not valid semver', async () => {
    assert.isFalse(
      _isFeatureEnabledInner({
        betaValue: 'v2.0.0-beta.1',
        currentVersion: 'v1.0.0-beta.1',
        isInternalUser: false,
        isTestEnvironment,
        prodValue: 'broken',
      })
    );
  });
});
