import 'dart:async'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import '../models/subscription_model.dart'; /// 구독 알림 서비스 class SubscriptionNotificationService extends ChangeNotifier { // 구독 만료 임박 기준 (일) static const int _expirationWarningDays = 7; // 알림 상태 bool _hasExpirationWarning = false; bool _hasExpired = false; DateTime? _expirationDate; Timer? _checkTimer; // 게터 bool get hasExpirationWarning => _hasExpirationWarning; bool get hasExpired => _hasExpired; DateTime? get expirationDate => _expirationDate; // 만료까지 남은 일수 int get daysUntilExpiration { if (_expirationDate == null) return 0; return _expirationDate!.difference(DateTime.now()).inDays; } // 만료일 포맷팅 (YYYY-MM-DD) String get formattedExpirationDate { if (_expirationDate == null) return ''; return DateFormat('yyyy-MM-dd').format(_expirationDate!); } SubscriptionNotificationService() { // 주기적으로 구독 상태 확인 (1시간마다) _checkTimer = Timer.periodic(const Duration(hours: 1), (_) { _checkExpirationStatus(); }); } /// 구독 정보 업데이트 void updateSubscription(Subscription? subscription) { if (subscription == null || !subscription.isActive) { _hasExpired = true; _hasExpirationWarning = false; _expirationDate = null; } else { _expirationDate = subscription.endDate; _checkExpirationStatus(); } notifyListeners(); } /// 만료 상태 확인 void _checkExpirationStatus() { if (_expirationDate == null) { _hasExpired = true; _hasExpirationWarning = false; return; } final now = DateTime.now(); final daysLeft = _expirationDate!.difference(now).inDays; // 만료 여부 확인 _hasExpired = now.isAfter(_expirationDate!); // 만료 임박 여부 확인 (7일 이내) _hasExpirationWarning = !_hasExpired && daysLeft <= _expirationWarningDays; notifyListeners(); } /// 알림 메시지 생성 String? getNotificationMessage() { if (_hasExpired) { return '구독이 만료되었습니다. 서비스 이용을 위해 구독을 갱신해 주세요.'; } else if (_hasExpirationWarning && _expirationDate != null) { return '구독이 $daysUntilExpiration일 후 만료됩니다. 서비스 이용을 위해 구독을 갱신해 주세요.'; } return null; } @override void dispose() { _checkTimer?.cancel(); super.dispose(); } }