// SPDX-FileCopyrightText: Copyright 2023 Open Mobile Platform LLC <community@omp.ru>
// SPDX-License-Identifier: BSD-3-Clause
import 'dart:convert';

import 'package:crypto/crypto.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:flutter_secure_storage_aurora/flutter_secure_storage_aurora.dart';
import 'package:scoped_model/scoped_model.dart';

/// Model for [FlutterSecureStoragePage]
class FlutterSecureStorageModel extends Model {
  /// Get [ScopedModel]
  static FlutterSecureStorageModel of(BuildContext context) =>
      ScopedModel.of<FlutterSecureStorageModel>(context);

  final _secureStorage = const FlutterSecureStorage();

  /// Error
  String? _error;

  /// Public error
  String? get error => _error;

  /// Public is error
  bool get isError => _error != null;

  /// Save success
  bool _isSuccess = false;

  /// Public success
  bool get isSuccess => _isSuccess;

  /// Value for read form secure storage
  String _readValue = "";

  /// Public read value
  String get readValue => _readValue;

  // Get data from secure storage
  Future<void> read({
    required String key,
    required String password,
  }) async {
    try {
      // Update secret key
      _updateByPassword(password);
      // Read data
      _readValue = await _secureStorage.read(key: key) ?? "Not found";
    } catch (e) {
      debugPrint(e.toString());
      _readValue = "Error password";
    }
    notifyListeners();
  }

  // Write new data in secure storage
  Future<void> write({
    required String key,
    required String value,
    required String password,
  }) async {
    try {
      // Update secret key
      _updateByPassword(password);
      // Clear old data
      await _secureStorage.deleteAll();
      // Save new data
      await _secureStorage.write(key: key, value: value);
      // Show success
      _isSuccess = true;
      // Close success
      Future.delayed(const Duration(milliseconds: 1500), () {
        _isSuccess = false;
        notifyListeners();
      });
    } catch (e) {
      _error = e.toString();
    }
    notifyListeners();
  }

  /// Update password
  void _updateByPassword(
    String password,
  ) {
    FlutterSecureStorageAurora.setSecret(
      _getPasswordFromString(password),
    );
  }

  /// Generate secure key 32 length from string password
  String _getPasswordFromString(
    String password,
  ) {
    return md5.convert(utf8.encode(password)).toString();
  }

  /// Clear value if change values
  void clearReadValue() {
    _readValue = "";
    notifyListeners();
  }
}