/// 일정 모델 library; /// 멤버 정보 class ScheduleMember { final int id; final String name; ScheduleMember({required this.id, required this.name}); factory ScheduleMember.fromJson(Map json) { return ScheduleMember( id: json['id'] as int, name: json['name'] as String, ); } } /// 관련 일정 (콘서트 회차 등) class RelatedDate { final int id; final String date; final String? time; RelatedDate({required this.id, required this.date, this.time}); factory RelatedDate.fromJson(Map json) { return RelatedDate( id: json['id'] as int, date: json['date'] as String, time: json['time'] as String?, ); } } /// 일정 상세 모델 class ScheduleDetail { final int id; final String title; final String date; final String? time; final String? description; final int categoryId; final String? categoryName; final String? categoryColor; final String? sourceUrl; final String? sourceName; final String? imageUrl; final List images; final String? locationName; final String? locationAddress; final String? locationLat; final String? locationLng; final List members; final List relatedDates; ScheduleDetail({ required this.id, required this.title, required this.date, this.time, this.description, required this.categoryId, this.categoryName, this.categoryColor, this.sourceUrl, this.sourceName, this.imageUrl, this.images = const [], this.locationName, this.locationAddress, this.locationLat, this.locationLng, this.members = const [], this.relatedDates = const [], }); factory ScheduleDetail.fromJson(Map json) { return ScheduleDetail( id: json['id'] as int, title: json['title'] as String, date: json['date'] as String, time: json['time'] as String?, description: json['description'] as String?, categoryId: json['category_id'] as int, categoryName: json['category_name'] as String?, categoryColor: json['category_color'] as String?, sourceUrl: json['source_url'] as String?, sourceName: json['source_name'] as String?, imageUrl: json['image_url'] as String?, images: (json['images'] as List?)?.cast() ?? [], locationName: json['location_name'] as String?, locationAddress: json['location_address'] as String?, locationLat: json['location_lat'] as String?, locationLng: json['location_lng'] as String?, members: (json['members'] as List?) ?.map((m) => ScheduleMember.fromJson(m)) .toList() ?? [], relatedDates: (json['related_dates'] as List?) ?.map((r) => RelatedDate.fromJson(r)) .toList() ?? [], ); } /// 시간 포맷 (HH:mm) String? get formattedTime { if (time == null) return null; return time!.length >= 5 ? time!.substring(0, 5) : time; } } class Schedule { final int id; final String title; final String date; final String? time; final String? endDate; final String? endTime; final String? description; final String? categoryName; final String? categoryColor; final String? memberNames; final String? sourceUrl; final String? sourceName; Schedule({ required this.id, required this.title, required this.date, this.time, this.endDate, this.endTime, this.description, this.categoryName, this.categoryColor, this.memberNames, this.sourceUrl, this.sourceName, }); factory Schedule.fromJson(Map json) { return Schedule( id: json['id'] as int, title: json['title'] as String, date: json['date'] as String, time: json['time'] as String?, endDate: json['end_date'] as String?, endTime: json['end_time'] as String?, description: json['description'] as String?, categoryName: json['category_name'] as String?, categoryColor: json['category_color'] as String?, memberNames: json['member_names'] as String?, sourceUrl: json['source_url'] as String?, sourceName: json['source_name'] as String?, ); } /// 멤버 리스트 반환 List get memberList { if (memberNames == null || memberNames!.isEmpty) return []; return memberNames!.split(',').map((n) => n.trim()).where((n) => n.isNotEmpty).toList(); } /// 시간 포맷 (HH:mm) String? get formattedTime { if (time == null) return null; return time!.length >= 5 ? time!.substring(0, 5) : time; } }