// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:typed_data';

import '../schema/schema.dart';
import '../uint8list_ops.dart' as utils;

/// Uniquely identifies a document.
class DocumentId {
  /// The schema of the document.
  final Schema schema;

  Uint8List _subId;
  static const int _subIdByteCount = 16;
  static const int _schemahashByteCount = 20;

  /// The length of the prefix.
  static const int prefixLength = _subIdByteCount + _schemahashByteCount;

  /// Default constructor.
  /// [identifier] uniquely identifies documents for the given schema.
  /// [identifier] must be 16 bytes long.
  /// If absent, a randomly generated [identifier] is used.
  DocumentId(this.schema, [Uint8List identifier]) {
    identifier ??= _randomByteArrayForSubIds();
    if (identifier.length != _subIdByteCount) {
      throw new ArgumentError(
          'Identifier does not contain $_subIdByteCount bytes.'
          'Found ${identifier.length} bytes instead.');
    }
    _subId = new Uint8List.fromList(identifier);
  }

  /// Convenience factory that builds a DocumentId from the [identifier]'s 8 lowest bytes.
  factory DocumentId.fromIntId(Schema schema, int identifier) {
    Uint8List bytes = new Uint8List(_subIdByteCount)
      ..buffer.asByteData().setUint64(0, identifier, Endian.little);
    return new DocumentId(schema, bytes);
  }

  /// Returns the [prefixLength] bytes long prefix to be used to store in Ledger the
  /// document identified with this DocumentId.
  Uint8List get prefix {
    Uint8List prefix = new Uint8List(_schemahashByteCount + _subIdByteCount);
    Uint8List schemaHash = schema.hash;
    assert(schemaHash.length == _schemahashByteCount);
    prefix..setAll(0, schemaHash)..setAll(_schemahashByteCount, _subId);
    return prefix;
  }

  /// Returns the identifier that can be used to create the same DocumentId.
  Uint8List get subId => new Uint8List.fromList(_subId);

  static Uint8List _randomByteArrayForSubIds() =>
      utils.randomUint8List(_subIdByteCount);
}
