import { describe, it, expect } from 'vitest';
import type { EntityTranslationStatus } from '@platform-modules/i18n-translator';
import { contentVisibleInLocale } from './content-visibility.js';

const ALL_STATUSES: EntityTranslationStatus[] = [
  'missing',
  'failed',
  'partial',
  'stale',
  'complete',
];

describe('contentVisibleInLocale', () => {
  describe('default locale — only authzVisible matters', () => {
    it('returns true when authzVisible is true regardless of translationStatus', () => {
      for (const status of ALL_STATUSES) {
        expect(contentVisibleInLocale(true, status, true)).toBe(true);
      }
    });

    it('returns false when authzVisible is false regardless of translationStatus', () => {
      for (const status of ALL_STATUSES) {
        expect(contentVisibleInLocale(false, status, true)).toBe(false);
      }
    });

    it('returns authzVisible when translationStatus is null or undefined', () => {
      expect(contentVisibleInLocale(true, null, true)).toBe(true);
      expect(contentVisibleInLocale(true, undefined, true)).toBe(true);
      expect(contentVisibleInLocale(false, null, true)).toBe(false);
      expect(contentVisibleInLocale(false, undefined, true)).toBe(false);
    });
  });

  describe('non-default locale — authz and translation status compose', () => {
    it('returns true only when authzVisible is true and translationStatus is complete', () => {
      expect(contentVisibleInLocale(true, 'complete', false)).toBe(true);
    });

    it('returns false when authzVisible is true but translationStatus is not complete', () => {
      const nonComplete: EntityTranslationStatus[] = ['missing', 'failed', 'partial', 'stale'];
      for (const status of nonComplete) {
        expect(contentVisibleInLocale(true, status, false)).toBe(false);
      }
    });

    it('returns false when authzVisible is false regardless of translationStatus', () => {
      for (const status of ALL_STATUSES) {
        expect(contentVisibleInLocale(false, status, false)).toBe(false);
      }
    });

    it('authzVisible=true, translationStatus=partial, isDefaultLocale=false → false', () => {
      expect(contentVisibleInLocale(true, 'partial', false)).toBe(false);
    });
  });

  describe('fail-safe — null/undefined translationStatus in non-default locale', () => {
    it('returns false when translationStatus is null', () => {
      expect(contentVisibleInLocale(true, null, false)).toBe(false);
      expect(contentVisibleInLocale(false, null, false)).toBe(false);
    });

    it('returns false when translationStatus is undefined', () => {
      expect(contentVisibleInLocale(true, undefined, false)).toBe(false);
      expect(contentVisibleInLocale(false, undefined, false)).toBe(false);
    });
  });

  describe('composition invariant — authz gates regardless of translation', () => {
    it('authzVisible=false with translationStatus=complete → false', () => {
      expect(contentVisibleInLocale(false, 'complete', false)).toBe(false);
    });
  });
});