// Fictional in-memory request contract. No live API, redirects, persistence, or credentials.
import assert from 'node:assert/strict';
const object = value => value !== null && typeof value === 'object' && !Array.isArray(value);
function exactKeys(value, expected) {
  return object(value) && Object.keys(value).length === expected.length && expected.every(k => Object.hasOwn(value, k));
}
function validV1(value) {
  return exactKeys(value, ['event_type', 'payload']) && typeof value.event_type === 'string' && value.event_type.trim() && object(value.payload);
}
function validV2(value) {
  return exactKeys(value, ['name', 'properties']) && typeof value.name === 'string' && value.name.trim() && object(value.properties);
}
function migrate(value) {
  if (!validV1(value)) throw new Error('Not a valid complete v1 request');
  return { name: value.event_type, properties: structuredClone(value.payload) };
}
function request(path, value) {
  if (path === '/v1/events') {
    if (!validV1(value)) return { status: 422, body: { error: 'invalid_v1_contract' } };
    return { status: 202, headers: { Deprecation: '@' + Date.parse('2026-09-01T00:00:00Z') / 1000,
      Sunset: 'Mon, 01 Mar 2027 00:00:00 GMT', Link: '<https://example.com/migrations/events-v2>; rel="deprecation"' },
      body: { receipt_id: 'receipt-example', state: 'queued' } };
  }
  if (path === '/v2/events') {
    if (!validV2(value)) return { status: 422, body: { error: 'invalid_v2_contract' } };
    return { status: 202, headers: {}, body: { event_id: 'receipt-example', status: 'accepted' } };
  }
  return { status: 404, body: { error: 'unknown_version' } };
}
const oldBody = { event_type: 'workspace.created', payload: { workspace_id: 'ws_example_001', nested: { enabled: true } } };
const nextBody = migrate(oldBody);
assert.deepEqual(nextBody, { name: 'workspace.created', properties: oldBody.payload });
assert.notEqual(nextBody.properties, oldBody.payload);
assert.equal(request('/v1/events', oldBody).status, 202);
assert.equal(request('/v2/events', oldBody).status, 422);
assert.equal(request('/v2/events', nextBody).status, 202);
assert.equal(request('/v1/events', nextBody).status, 422);
assert.equal(request('/v3/events', nextBody).status, 404);
assert.throws(() => migrate({ ...oldBody, unknown_field: true }));
assert.throws(() => migrate({ event_type: '', payload: {} }));
assert.throws(() => migrate({ event_type: 'valid', payload: [] }));
const oldReply = request('/v1/events', oldBody);
assert.equal(oldReply.headers.Deprecation, '@1788220800');
assert.equal(oldReply.headers.Sunset, new Date('2027-03-01T00:00:00Z').toUTCString());
assert.ok(!Object.hasOwn(oldReply.headers, 'Location'));
assert.equal(oldReply.body.state, 'queued');
assert.equal(request('/v2/events', nextBody).body.status, 'accepted');
assert.deepEqual(oldBody.payload.nested, { enabled: true });
process.stdout.write(JSON.stringify({ fictional: true, node: process.version, assertions: 16,
  oldRequest: oldBody, migratedRequest: nextBody, supportedOldVersionResponse: oldReply,
  newVersionResponse: request('/v2/events', nextBody) }, null, 2) + '\n');
