import 'dart:async';

import 'package:get/get.dart';
import 'package:get/get_state_manager/src/simple/get_controllers.dart';

// i_otp_repository.dart
abstract class IOtpRepository {
  Future<void> sendOtp();
  Future<bool> verifyOtp(String otpCode);
  Future<void> resendOtp();
}

class OtpViewModel extends GetxController {
  final IOtpRepository repository;

  // Mã OTP người dùng nhập
  var otpCode = "".obs;
  // Lỗi (nếu OTP sai)
  var errorMessage = "".obs;

  // Đếm ngược thời gian resend
  final int _maxCountdown = 150; // 2 phút 30 giây
  var currentCountdown = 0.obs;
  Timer? _timer;

  OtpViewModel(this.repository);

  @override
  void onInit() {
    super.onInit();
    // Gửi OTP ngay khi vào màn hình (tuỳ logic)
    sendOtp();
    startCountdown();
  }

  @override
  void onClose() {
    _timer?.cancel();
    super.onClose();
  }

  /// Gửi OTP (lần đầu)
  Future<void> sendOtp() async {
    try {
      await repository.sendOtp();
      // Reset countdown
      startCountdown();
    } catch (e) {
      errorMessage.value = "Gửi OTP thất bại. Vui lòng thử lại.";
    }
  }

  // Đếm ngược 2:30
  void startCountdown() {
    currentCountdown.value = _maxCountdown;
    _timer?.cancel();
    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      if (currentCountdown.value <= 0) {
        timer.cancel();
      } else {
        currentCountdown.value--;
      }
    });
  }

  String get countdownText {
    final m = currentCountdown.value ~/ 60;
    final s = currentCountdown.value % 60;
    final sStr = s < 10 ? "0$s" : "$s";
    return "$m:$sStr";
  }

  // User nhập OTP
  void onOtpChanged(String value) {
    otpCode.value = value;
    errorMessage.value = ""; // clear lỗi cũ
  }

  // Submit OTP
  Future<void> onSubmitOtp() async {
    if (otpCode.value.length < 6) {
      errorMessage.value = "Vui lòng nhập đủ 6 ký tự";
      return;
    }
    try {
      final success = await repository.verifyOtp(otpCode.value);
      if (success) {
        errorMessage.value = "";
        // TODO: Navigate or do something
        // Example: Get.offAllNamed("/home");
        print("OTP chính xác! Điều hướng tiếp...");
      } else {
        errorMessage.value = "Mã OTP không chính xác";
      }
    } catch (e) {
      errorMessage.value = "Xác thực OTP thất bại. Thử lại.";
    }
  }

  // Bấm "Gửi lại OTP"
  Future<void> onResendOtp() async {
    if (currentCountdown.value > 0) {
      // Chưa hết thời gian => return
      return;
    }
    try {
      await repository.resendOtp();
      startCountdown();
    } catch (e) {
      errorMessage.value = "Gửi lại OTP thất bại. Thử lại.";
    }
  }
}