import 'package:hive_flutter/hive_flutter.dart';

part 'subscription_model.g.dart';

@HiveType(typeId: 0)
class SubscriptionModel extends HiveObject {
  @HiveField(0)
  final String id;

  @HiveField(1)
  String serviceName;

  @HiveField(2)
  double monthlyCost;

  @HiveField(3)
  String billingCycle; // 'monthly', 'yearly', 'weekly' - 영어 키값 사용

  @HiveField(4)
  DateTime nextBillingDate;

  @HiveField(5)
  bool isAutoDetected; // SMS로 추가된 경우 true

  @HiveField(6)
  String? categoryId;

  @HiveField(7)
  String? websiteUrl; // 홈페이지 URL

  @HiveField(8)
  int repeatCount; // 반복 결제 횟수

  @HiveField(9)
  DateTime? lastPaymentDate; // 마지막 결제일

  @HiveField(10)
  String currency; // 통화 단위: 'KRW' 또는 'USD'

  @HiveField(11)
  bool isEventActive; // 이벤트 활성화 여부

  @HiveField(12)
  DateTime? eventStartDate; // 이벤트 시작일

  @HiveField(13)
  DateTime? eventEndDate; // 이벤트 종료일

  @HiveField(14)
  double? eventPrice; // 이벤트 기간 중 가격

  @HiveField(15)
  String? paymentCardId; // 연결된 결제수단의 ID

  SubscriptionModel({
    required this.id,
    required this.serviceName,
    required this.monthlyCost,
    required this.billingCycle,
    required this.nextBillingDate,
    this.isAutoDetected = false,
    this.categoryId,
    this.websiteUrl,
    this.repeatCount = 1,
    this.lastPaymentDate,
    this.currency = 'KRW', // 기본값은 KRW
    this.isEventActive = false, // 기본값은 false
    this.eventStartDate,
    this.eventEndDate,
    this.eventPrice,
    this.paymentCardId,
  });

  // 주기적 결제 여부 확인
  bool get isRecurring => repeatCount > 1;

  // 현재 이벤트 기간인지 확인
  bool get isCurrentlyInEvent {
    if (!isEventActive || eventStartDate == null || eventEndDate == null) {
      return false;
    }

    final now = DateTime.now();
    return now.isAfter(eventStartDate!) && now.isBefore(eventEndDate!);
  }

  // 현재 적용되는 가격 (이벤트 또는 정상 가격)
  double get currentPrice {
    if (isCurrentlyInEvent && eventPrice != null) {
      return eventPrice!;
    }
    return monthlyCost;
  }

  // 이벤트로 인한 절약액
  double get eventSavings {
    if (isCurrentlyInEvent && eventPrice != null) {
      return monthlyCost - eventPrice!;
    }
    return 0;
  }

  // 원래 가격 (이벤트와 관계없이 항상 정상 가격)
  double get originalPrice => monthlyCost;

  // 결제 주기를 영어 키값으로 정규화
  static String normalizeBillingCycle(String cycle) {
    switch (cycle.toLowerCase()) {
      case 'monthly':
      case '월간':
      case '月間':
      case '月付':
        return 'monthly';
      case 'weekly':
      case '주간':
      case '週間':
      case '周付':
        return 'weekly';
      case 'yearly':
      case '연간':
      case '年間':
      case '年付':
        return 'yearly';
      default:
        return 'monthly'; // 기본값은 monthly
    }
  }

  // 결제 주기를 영어 키값으로 반환 (내부 사용)
  String get billingCycleKey => normalizeBillingCycle(billingCycle);
}

// Hive TypeAdapter 생성을 위한 명령어
// flutter pub run build_runner build
