// core/types/tests/interfaces-reexport.spec.ts
// Tests for interfaces that extend/re-export Proto types

import { describe, expect, test } from 'bun:test';
// Import from interfaces (user perspective)
import type { IStateContext } from '../interfaces';
// Import from Proto
import type { TMultisig } from '../lib/type_pb';

describe('interfaces extending Proto types', () => {
  describe('IStateContext extends TStateContext', () => {
    test('IStateContext should have genesisTx and renaissanceTx from TStateContext', () => {
      const context: IStateContext = {
        genesisTx: 'tx1',
        renaissanceTx: 'tx2',
      };
      expect(context.genesisTx).toBe('tx1');
      expect(context.renaissanceTx).toBe('tx2');
    });

    test('IStateContext should accept string timestamps', () => {
      const context: IStateContext = {
        genesisTx: 'tx1',
        renaissanceTx: 'tx2',
        genesisTime: '2024-01-01T00:00:00Z',
        renaissanceTime: '2024-01-02T00:00:00Z',
      };
      expect(context.genesisTime).toBe('2024-01-01T00:00:00Z');
    });

    test('IStateContext should accept Date timestamps', () => {
      const now = new Date();
      const context: IStateContext = {
        genesisTx: 'tx1',
        renaissanceTx: 'tx2',
        genesisTime: now,
        renaissanceTime: now,
      };
      expect(context.genesisTime).toBe(now);
    });

    test('IStateContext should accept number timestamps', () => {
      const ts = Date.now();
      const context: IStateContext = {
        genesisTx: 'tx1',
        renaissanceTx: 'tx2',
        genesisTime: ts,
        renaissanceTime: ts,
      };
      expect(context.genesisTime).toBe(ts);
    });
  });

  describe('TMultisig from Proto', () => {
    test('TMultisig should accept Uint8Array pk/signature', () => {
      const proto: TMultisig = {
        signer: 'z123',
        pk: new Uint8Array([1, 2, 3]),
        signature: new Uint8Array([4, 5, 6]),
        delegator: 'z456',
        data: { typeUrl: '', value: new Uint8Array() },
      };
      expect(proto.signer).toBe('z123');
    });

    test('TMultisig should work with string pk/signature', () => {
      const proto: TMultisig = {
        signer: 'z123',
        pk: 'base64pk',
        signature: 'base64sig',
        delegator: '',
      };
      expect(proto.pk).toBe('base64pk');
    });
  });
});
