import 'dart:async';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';

import '../models/subscription_model.dart';
import '../utils/test_utils.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() {
    // 테스트 환경에서는 Timer를 생성하지 않음
    if (!TestUtils.isInTest) {
      // 주기적으로 구독 상태 확인 (1시간마다)
      _checkTimer = Timer.periodic(const Duration(hours: 1), (_) {
        _checkExpirationStatus();
      });
    } else {
      // 테스트 환경에서는 즉시 한 번만 체크
      _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() {
    // Timer가 있으면 취소
    if (_checkTimer != null) {
      _checkTimer!.cancel();
      _checkTimer = null;
    }
    super.dispose();
  }
}
