import { DyFM_StoredSecret } from '../_models/stored-secret.control-model';
import { DyFM_StoredSecret_Util } from './stored-secret.util';

describe('| DyFM_StoredSecret_Util', () => {

  // valid-formatumu teszt-kulcsok (a DyFM_SECRET_PATTERNS-hez igazitva)
  const openAiKey: string = 'sk-abcdefghij1234567890abcdefghij1234567890';
  const anthropicKey: string = 'sk-ant-abcdefghij1234567890abcdefghij1234567890';
  const githubPat: string = 'ghp_abcdefghij1234567890abcdefghij1234567890';

  describe('| detectKind', () => {
    it('| OpenAI kulcsot felismer', () => {
      expect(DyFM_StoredSecret_Util.detectKind(openAiKey)).toBe('openai-key');
    });

    it('| Anthropic kulcsot felismer (a sk-ant- specifikusabb mint a sk-)', () => {
      expect(DyFM_StoredSecret_Util.detectKind(anthropicKey)).toBe('anthropic-key');
    });

    it('| GitHub PAT-ot felismer', () => {
      expect(DyFM_StoredSecret_Util.detectKind(githubPat)).toBe('github-pat');
    });

    it('| ismeretlen formatumra undefined', () => {
      expect(DyFM_StoredSecret_Util.detectKind('not-a-known-secret-format')).toBeUndefined();
    });

    it('| ures inputra undefined', () => {
      expect(DyFM_StoredSecret_Util.detectKind('')).toBeUndefined();
    });
  });

  describe('| derivePreview', () => {
    it('| normal kulcsbol maskedPreview + keyLength + kind', () => {
      const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey);
      expect(preview.maskedPreview).toBe('sk-a...7890');
      expect(preview.keyLength).toBe(openAiKey.length);
      expect(preview.kind).toBe('openai-key');
      // a nyers kulcs SOHA nem jelenik meg teljes egeszeben a preview-ban
      expect(preview.maskedPreview).not.toContain('abcdefghij');
    });

    it('| tul rovid secret -> opaque preview, de keyLength megvan', () => {
      const preview = DyFM_StoredSecret_Util.derivePreview('short');
      expect(preview.maskedPreview).toBe('...');
      expect(preview.keyLength).toBe(5);
    });

    it('| 0/0 reveal -> opaque', () => {
      const preview = DyFM_StoredSecret_Util.derivePreview(openAiKey, { prefix: 0, suffix: 0 });
      expect(preview.maskedPreview).toBe('...');
    });

    it('| ures input -> opaque + keyLength 0', () => {
      const preview = DyFM_StoredSecret_Util.derivePreview('');
      expect(preview.maskedPreview).toBe('...');
      expect(preview.keyLength).toBe(0);
      expect(preview.kind).toBeUndefined();
    });
  });

  describe('| build', () => {
    it('| osszeallit egy DyFM_StoredSecret-et a masked-reszekkel + encryptedValue-val', () => {
      const secret: DyFM_StoredSecret = DyFM_StoredSecret_Util.build({
        rawSecret: anthropicKey,
        encryptedValue: 'ENCRYPTED-BLOB-xyz',
        label: 'Anthropic Prod',
      });

      expect(secret.label).toBe('Anthropic Prod');
      expect(secret.kind).toBe('anthropic-key');
      expect(secret.maskedPreview).toBe('sk-a...7890');
      expect(secret.keyLength).toBe(anthropicKey.length);
      expect(secret.encryptedValue).toBe('ENCRYPTED-BLOB-xyz');
      expect(secret.isActive).toBe(true);
      // a nyers kulcs NINCS eltarolva a modellben (csak az encryptedValue + a masked-resz)
      expect(JSON.stringify(secret)).not.toContain('abcdefghij');
    });
  });

});
