import 'package:flutter/material.dart';
import 'dart:async';
import 'package:tugas_akhir_supabase/services/session_manager.dart';

/// Mixin untuk memeriksa status session di halaman-halaman utama aplikasi
mixin SessionCheckerMixin<T extends StatefulWidget> on State<T> {
  bool _isCheckingSession = false;

  /// Periksa status session saat halaman dibuka
  Future<void> checkSessionStatus() async {
    if (_isCheckingSession) return;
    _isCheckingSession = true;

    try {
      // Tambahkan timeout untuk mencegah blocking
      final isValid = await SessionManager.isSessionValid().timeout(
        const Duration(seconds: 3),
        onTimeout: () {
          debugPrint('SessionChecker: Session check timed out');
          return true; // Assume valid on timeout
        },
      );

      if (!isValid && mounted) {
        // Session tidak valid, update timestamp untuk mencegah pemanggilan berulang
        await SessionManager.updateLastActiveTime().timeout(
          const Duration(seconds: 2),
          onTimeout: () {
            debugPrint('SessionChecker: Update activity timed out');
            return;
          },
        );
      }
    } catch (e) {
      debugPrint('SessionChecker: Error checking session - $e');
    } finally {
      _isCheckingSession = false;
    }
  }

  /// Perbarui timestamp aktivitas pengguna
  Future<void> updateUserActivity() async {
    try {
      // Tambahkan timeout untuk mencegah blocking
      await SessionManager.updateLastActiveTime().timeout(
        const Duration(seconds: 2),
        onTimeout: () {
          debugPrint('SessionChecker: Update activity timed out');
          return;
        },
      );
    } catch (e) {
      debugPrint('SessionChecker: Error updating activity - $e');
    }
  }

  /// Panggil di initState untuk memeriksa session
  void initSessionChecking() {
    // Periksa session setelah widget dibangun dengan delay
    // untuk mencegah terlalu banyak operasi di startup
    Future.delayed(Duration(milliseconds: 500), () {
      if (mounted) {
        checkSessionStatus();
      }
    });
  }

  /// Panggil di dispose untuk membersihkan resource
  void disposeSessionChecking() {
    // Tidak ada resource yang perlu dibersihkan
  }
}
