/**
 * Deploy-bundle invariant — registered themes, THEME_REGISTRY_META ↔ MOD_CMS_THEMES parity.
 * Run under the render vitest project (registry.ts imports .astro Shell/override graph).
 */
import { describe, expect, it } from 'vitest';
import { THEME_REGISTRY_META } from '../lib/theme.js';
import { MOD_CMS_THEMES, resolveModTheme } from './registry.js';
import { DEFAULT_THEME_ID } from '../lib/theme.js';

const EXPECTED_THEME_IDS = ['blog', 'default', 'editorial', 'magazine'] as const;

describe('deploy-bundle — theme registry invariant', () => {
  it('ships exactly four themes in THEME_REGISTRY_META', () => {
    expect(THEME_REGISTRY_META.length).toBe(4);
  });

  it('every THEME_REGISTRY_META id has a ModTheme with Shell in MOD_CMS_THEMES', () => {
    for (const meta of THEME_REGISTRY_META) {
      const theme = MOD_CMS_THEMES[meta.id];
      expect(theme, `missing MOD_CMS_THEMES record for meta id "${meta.id}"`).toBeDefined();
      expect(theme.Shell, `MOD_CMS_THEMES["${meta.id}"] has no Shell`).toBeDefined();
    }
  });

  it('every MOD_CMS_THEMES key appears in THEME_REGISTRY_META', () => {
    const metaIds = new Set(THEME_REGISTRY_META.map((t) => t.id));
    for (const key of Object.keys(MOD_CMS_THEMES)) {
      expect(metaIds.has(key), `MOD_CMS_THEMES key "${key}" missing from THEME_REGISTRY_META`).toBe(
        true,
      );
    }
  });

  it('every THEME_REGISTRY_META id appears in MOD_CMS_THEMES', () => {
    for (const meta of THEME_REGISTRY_META) {
      expect(
        MOD_CMS_THEMES[meta.id],
        `THEME_REGISTRY_META id "${meta.id}" missing from MOD_CMS_THEMES`,
      ).toBeDefined();
    }
  });

  it('registered theme ids are exactly blog, default, editorial, magazine', () => {
    const metaIds = THEME_REGISTRY_META.map((t) => t.id).sort();
    const registryIds = Object.keys(MOD_CMS_THEMES).sort();
    expect(metaIds).toEqual([...EXPECTED_THEME_IDS]);
    expect(registryIds).toEqual([...EXPECTED_THEME_IDS]);
  });

  it('DEFAULT_THEME_ID resolves via resolveModTheme (total fallback contract)', () => {
    expect(resolveModTheme(DEFAULT_THEME_ID).id).toBe(DEFAULT_THEME_ID);
    expect(resolveModTheme('nonexistent-theme-id').id).toBe(DEFAULT_THEME_ID);
  });
});
