/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */

import { Vertex, Edge, Property, VertexProperty, Path } from '../../../lib/structure/graph.js';
import { direction, t } from '../../../lib/process/traversal.js';

/*
 * Unsupported types (no map entries, .gbin files exist but types not implemented):
 * - single-byte-char, multi-byte-char (Char 0x80 not implemented)
 * - traversal-tree (Tree type not implemented)
 * - tinker-graph (Graph type not implemented)
 * - pos-bigdecimal, neg-bigdecimal (BigDecimal type not implemented)
 * - forever-duration, zero-duration (Duration type not implemented)
 */

const model = {};

// BigInteger values
model['pos-biginteger'] = BigInt('123456789987654321123456789987654321');
model['neg-biginteger'] = BigInt('-123456789987654321123456789987654321');

// Byte values (JS has no byte type, deserializes to Number)
model['min-byte'] = -128;
model['max-byte'] = 127;

// Binary values
model['empty-binary'] = Buffer.from('', 'utf-8');
model['str-binary'] = Buffer.from('some bytes for you', 'utf-8');

// Double values
model['max-double'] = 1.7976931348623157e+308;
model['min-double'] = 5e-324;
model['neg-max-double'] = -1.7976931348623157e+308;
model['neg-min-double'] = -5e-324;
model['nan-double'] = NaN;
model['pos-inf-double'] = Infinity;
model['neg-inf-double'] = -Infinity;
model['neg-zero-double'] = -0;

// Float values (JS has no float type, deserializes to Number with IEEE 754 double representation)
model['max-float'] = 3.4028234663852886e+38;
model['min-float'] = 1.401298464324817e-45;
model['neg-max-float'] = -3.4028234663852886e+38;
model['neg-min-float'] = -1.401298464324817e-45;
model['nan-float'] = NaN;
model['pos-inf-float'] = Infinity;
model['neg-inf-float'] = -Infinity;
model['neg-zero-float'] = -0;

// Null
model['unspecified-null'] = null;

// Boolean values
model['true-boolean'] = true;
model['false-boolean'] = false;

// String values
model['single-byte-string'] = 'abc';
model['mixed-string'] = 'abc\u0391\u0392\u0393';

// List values
model['var-bulklist'] = ['marko', 'josh', 'josh'];
model['empty-bulklist'] = [];
model['var-type-list'] = [1, 'person', true, null];
model['empty-list'] = [];

// Edge values
model['traversal-edge'] = new Edge(
  13,
  new Vertex(1, 'person'),    // outV (first in JS constructor)
  'develops',
  new Vertex(10, 'software'), // inV
  [new Property('since', 2009)]
);
model['no-prop-edge'] = new Edge(
  13,
  new Vertex(1, 'person'),
  'develops',
  new Vertex(10, 'software')
);

// Integer values
model['max-int'] = 2147483647;
model['min-int'] = -2147483648;

// Long values
model['max-long'] = 9223372036854775807n;
model['min-long'] = -9223372036854775808n;

// Map values
const dateKey = new Date(Date.UTC(1970, 0, 1, 0, 24, 41, 295)); // 1481295 ms
model['var-type-map'] = new Map([
  [null, null],
  [[1, 2, 3], dateKey],
  [dateKey, 'red'],
  ['test', 123]
]);
model['empty-map'] = new Map();

// Path values
model['traversal-path'] = new Path(
  [new Set(), new Set(), new Set()],
  [new Vertex(1, 'person'), new Vertex(10, 'software'), new Vertex(11, 'software')]
);
model['empty-path'] = new Path([], []);

// Complex path with nested properties
const propPathVertex = new Vertex(1, 'person', [
  new VertexProperty(0, 'name', 'marko'),
  new VertexProperty(6, 'location', 'san diego', [
    new Property('startTime', 1997),
    new Property('endTime', 2001)
  ]),
  new VertexProperty(7, 'location', 'santa cruz', [
    new Property('startTime', 2001),
    new Property('endTime', 2004)
  ]),
  new VertexProperty(8, 'location', 'brussels', [
    new Property('startTime', 2004),
    new Property('endTime', 2005)
  ]),
  new VertexProperty(9, 'location', 'santa fe', [
    new Property('startTime', 2005)
  ])
]);
const propPathVertex2 = new Vertex(10, 'software', [
  new VertexProperty(4, 'name', 'gremlin')
]);
const propPathVertex3 = new Vertex(11, 'software', [
  new VertexProperty(5, 'name', 'tinkergraph')
]);
model['prop-path'] = new Path(
  [new Set(), new Set(), new Set()],
  [propPathVertex, propPathVertex2, propPathVertex3]
);

// Property values (no parent param in JS)
model['edge-property'] = new Property('since', 2009);
model['null-property'] = new Property('', null);

// Set values
model['var-type-set'] = new Set([2, 'person', true, null]);
model['empty-set'] = new Set();

// Short values (JS has no short type, deserializes to Number)
model['max-short'] = 32767;
model['min-short'] = -32768;

// UUID values (plain strings in JS)
model['specified-uuid'] = '41d2e28a-20a4-4ab0-b379-d810dede3786';
model['nil-uuid'] = '00000000-0000-0000-0000-000000000000';

// Vertex values
model['no-prop-vertex'] = new Vertex(1, 'person');

// VertexProperty values (no parent param, key equals label)
model['traversal-vertexproperty'] = new VertexProperty(0, 'name', 'marko');
model['meta-vertexproperty'] = new VertexProperty(1, 'person', 'stephen', [new Property('a', 'b')]);
model['set-cardinality-vertexproperty'] = new VertexProperty(1, 'person', new Set(['stephen', 'marko']), [new Property('a', 'b')]);

// Enum values
model['id-t'] = t.id;
model['out-direction'] = direction.out;

// Complex vertex with properties (from .gbin deserialization structure)
const name = new VertexProperty(0, 'name', 'marko');
const sanDiego = new VertexProperty(6, 'location', 'san diego', [
  new Property('startTime', 1997),
  new Property('endTime', 2001)
]);
const santaCruz = new VertexProperty(7, 'location', 'santa cruz', [
  new Property('startTime', 2001),
  new Property('endTime', 2004)
]);
const brussels = new VertexProperty(8, 'location', 'brussels', [
  new Property('startTime', 2004),
  new Property('endTime', 2005)
]);
const santaFe = new VertexProperty(9, 'location', 'santa fe', [
  new Property('startTime', 2005)
]);
model['traversal-vertex'] = new Vertex(1, 'person', [name, sanDiego, santaCruz, brussels, santaFe]);

// DateTime values (invalid dates for overflow cases)
model['max-offsetdatetime'] = new Date(NaN);  // Year 999999999 overflows JS Date
model['min-offsetdatetime'] = new Date(NaN);  // Year -999999999 overflows JS Date

export { model };