// 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:convert';
import 'dart:typed_data';

import 'package:collection/collection.dart';
import 'package:fidl_fuchsia_ledger/fidl.dart' as ledger;

import 'uint8list_ops.dart';
import 'version.dart';

/// Convenience wrapper of Ledger's page id.
/// For a given `pageName`, SledgePageId will generate a ledger.PageId with the
/// following format: sledge${sledgeVersion}_${hash(pageName)}.
class SledgePageId {
  ledger.PageId _id;

  /// The prefix of the Ledger page managed by Sledge.
  static final Uint8List prefix = utf8.encode(_sledgePageIdPrefix());

  /// Convenience constructor that takes an optional string.
  SledgePageId([String pageName = '']) {
    pageName ??= '';

    final Uint8List hashedPageName = hash(new Utf8Encoder().convert(pageName));

    final encodedPageName = concatUint8Lists(prefix, hashedPageName);

    final trimmedEncodedPageName = encodedPageName.sublist(0, 16);
    assert(trimmedEncodedPageName.length == 16);

    _id = new ledger.PageId(id: trimmedEncodedPageName);
  }

  /// The Ledger's PageId.
  // TODO: rename into ledgePageId.
  ledger.PageId get id => _id;

  /// Returns the prefix of a ledger PageId managed by the current version of
  /// Sledge.
  static String _sledgePageIdPrefix() {
    return 'sledge${sledgeVersion}_';
  }

  /// Returns true if the page identified with [pageId] is managed by this
  /// version of Sledge.
  static bool pageIsManagedBySledge(ledger.PageId pageId) {
    final pageIdPrefix = getSublistView(pageId.id, end: prefix.length);
    return new ListEquality<int>().equals(pageIdPrefix, prefix);
  }
}
