import 'package:flutter/material.dart'; import 'package:get_it/get_it.dart'; import 'package:superport/data/models/dashboard/equipment_status_distribution.dart'; import 'package:superport/data/models/dashboard/expiring_license.dart'; import 'package:superport/data/models/dashboard/overview_stats.dart'; import 'package:superport/data/models/dashboard/recent_activity.dart'; import 'package:superport/services/dashboard_service.dart'; import 'package:superport/screens/common/theme_tailwind.dart'; // 대시보드(Overview) 화면의 상태 및 비즈니스 로직을 담답하는 컨트롤러 class OverviewController extends ChangeNotifier { final DashboardService _dashboardService = GetIt.instance(); // 상태 데이터 OverviewStats? _overviewStats; List _recentActivities = []; EquipmentStatusDistribution? _equipmentStatus; List _expiringLicenses = []; // 로딩 상태 bool _isLoadingStats = false; bool _isLoadingActivities = false; bool _isLoadingEquipmentStatus = false; bool _isLoadingLicenses = false; // 에러 상태 String? _statsError; String? _activitiesError; String? _equipmentStatusError; String? _licensesError; // Getters OverviewStats? get overviewStats => _overviewStats; List get recentActivities => _recentActivities; EquipmentStatusDistribution? get equipmentStatus => _equipmentStatus; List get expiringLicenses => _expiringLicenses; // 추가 getter int get totalCompanies => _overviewStats?.totalCompanies ?? 0; int get totalUsers => _overviewStats?.totalUsers ?? 0; bool get isLoading => _isLoadingStats || _isLoadingActivities || _isLoadingEquipmentStatus || _isLoadingLicenses; String? get error { return _statsError ?? _activitiesError ?? _equipmentStatusError ?? _licensesError; } OverviewController(); // 데이터 로드 Future loadData() async { await Future.wait([ _loadOverviewStats(), _loadRecentActivities(), _loadEquipmentStatus(), _loadExpiringLicenses(), ]); } // 대시보드 데이터 로드 (loadData의 alias) Future loadDashboardData() async { await loadData(); } // 개별 데이터 로드 메서드 Future _loadOverviewStats() async { _isLoadingStats = true; _statsError = null; notifyListeners(); final result = await _dashboardService.getOverviewStats(); result.fold( (failure) { _statsError = failure.message; }, (stats) { _overviewStats = stats; }, ); _isLoadingStats = false; notifyListeners(); } Future _loadRecentActivities() async { _isLoadingActivities = true; _activitiesError = null; notifyListeners(); final result = await _dashboardService.getRecentActivities(); result.fold( (failure) { _activitiesError = failure.message; }, (activities) { _recentActivities = activities; }, ); _isLoadingActivities = false; notifyListeners(); } Future _loadEquipmentStatus() async { _isLoadingEquipmentStatus = true; _equipmentStatusError = null; notifyListeners(); final result = await _dashboardService.getEquipmentStatusDistribution(); result.fold( (failure) { _equipmentStatusError = failure.message; }, (status) { _equipmentStatus = status; }, ); _isLoadingEquipmentStatus = false; notifyListeners(); } Future _loadExpiringLicenses() async { _isLoadingLicenses = true; _licensesError = null; notifyListeners(); final result = await _dashboardService.getExpiringLicenses(days: 30); result.fold( (failure) { _licensesError = failure.message; }, (licenses) { _expiringLicenses = licenses; }, ); _isLoadingLicenses = false; notifyListeners(); } // 활동 타입별 아이콘과 색상 가져오기 IconData getActivityIcon(String activityType) { switch (activityType.toLowerCase()) { case 'equipment_in': case '장비 입고': return Icons.input; case 'equipment_out': case '장비 출고': return Icons.output; case 'user_create': case '사용자 추가': return Icons.person_add; case 'license_create': case '라이선스 등록': return Icons.vpn_key; default: return Icons.notifications; } } Color getActivityColor(String activityType) { switch (activityType.toLowerCase()) { case 'equipment_in': case '장비 입고': return AppThemeTailwind.success; case 'equipment_out': case '장비 출고': return AppThemeTailwind.warning; case 'user_create': case '사용자 추가': return AppThemeTailwind.primary; case 'license_create': case '라이선스 등록': return AppThemeTailwind.info; default: return AppThemeTailwind.muted; } } }