import 'dart:math';

import '../security/secret_store.dart';

/// A stable per-INSTALL device id, kept in the keystore. Distinct from the
/// seed-derived CRDT node id (`rootSeedHex.substring(0,16)`), which is IDENTICAL
/// across a user's devices — so it can't tell them apart. Device-to-device sync
/// needs each device to own a separate record, hence a random per-install id.
class DeviceIdStore {
  DeviceIdStore(this._store, {Random? random}) : _random = random ?? Random.secure();

  final SecretStore _store;
  final Random _random;

  static const _key = 'tane.device.id';

  Future<String>? _cached;

  /// This install's device id, generated and persisted on first use.
  Future<String> deviceId() => _cached ??= _readOrCreate();

  Future<String> _readOrCreate() async {
    final existing = await _store.read(_key);
    if (existing != null && existing.isNotEmpty) return existing;
    final id = _randomHex(8); // 64 bits — plenty to avoid device collisions
    await _store.write(_key, id);
    return id;
  }

  String _randomHex(int bytes) => [
        for (var i = 0; i < bytes; i++)
          _random.nextInt(256).toRadixString(16).padLeft(2, '0'),
      ].join();
}
