import 'package:auth_totp/auth_totp.dart';

/// otpauth://totp/{}?secret={}&issuer={}
class Totp {
  /// for persistent
  final String uri;
  final String issuer;

  final String secret;
  final int interval;

  Totp({
    required this.uri,
    required this.issuer,
    required this.secret,
    required this.interval,
  });

  String get now => AuthTOTP.generateTOTPCode(
        secretKey: secret,
        interval: interval,
      );

  static Totp? fromUri(String uri) {
    final totpUri = Uri.tryParse(uri);
    if (totpUri == null) return null;

    final query = totpUri.queryParameters;
    final secret = query["secret"];
    if (secret == null) return null;

    // final digit = query["digits"];
    final period = query["period"];
    final issuerQuery = query["issuer"];

    final lastPathSeg = totpUri.pathSegments.lastOrNull;
    final colonPos = lastPathSeg?.indexOf(":");
    final account = colonPos == null
        ? null
        : colonPos == -1
            ? lastPathSeg!
            : lastPathSeg!.substring(colonPos + 1);

    final issuer = issuerQuery == null
        ? lastPathSeg ?? "UNKNOWN"
        : "$issuerQuery${account == null ? "" : ":$account"}";

    return Totp(
      uri: uri,
      issuer: issuer,
      secret: secret,
      interval: period == null ? 30 : int.tryParse(period) ?? 30,
    );
  }
}