// Copyright 2019 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 'package:fuchsia_logger/logger.dart';
import 'package:meta/meta.dart';
import 'tlds_provider.dart';
import 'valid_tlds.dart';

class TldChecker {
  late List<String> _validTlds;

  /// A flag that indicates if the valid TLD list is loaded or not.
  ///
  /// Its default value on the initilization is 'false'. and is set to 'true'
  /// once the [prefetchTlds()] is called, and never changes unless the browser
  /// is relaunched and this [TldChecker] is newly initiated.
  late bool _isIanaTldsLoaded;

  static final TldChecker _tldCheckerInstance = TldChecker._create();
  factory TldChecker() {
    return _tldCheckerInstance;
  }

  TldChecker._create() {
    _validTlds = kValidTlds;
    _isIanaTldsLoaded = false;
    log.info('A singleton TldChecker instance has been created.');
  }

  /// Fetches a valid TLD list from the IANA if it has not loaded yet.
  ///
  /// If a List<String> type parameter is given, it does not fetch the TLD list
  /// from the web and instead, just uses the parameter list as the valid TLD
  /// list. Therefore, this parameter should be given only for testing purposes.
  void prefetchTlds({List<String>? testTlds}) async {
    if (testTlds != null) {
      _validTlds = testTlds;
    } else {
      if (!_isIanaTldsLoaded) {
        _validTlds = await TldsProvider().fetchTldsList() ?? kValidTlds;
        _isIanaTldsLoaded = true;
      } else {
        log.warning(
            'TLD List is already loaded. You do not need to fetch it again.');
      }
    }
  }

  bool isValid(String tld) => _validTlds.contains(tld.toUpperCase());

  @visibleForTesting
  List<String> get validTlds => _validTlds;
}
