import 'dart:async'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:hive_flutter/hive_flutter.dart'; import '../cekirdek/kimlik.dart'; import '../cekirdek/log.dart'; import '../modeller/job.dart'; import 'job_orkestratoru.dart'; class ZamanlanmisGorev { final String id; final String projeId; final String projeIsmi; final DateTime zaman; final List hedefSegmentIdleri; // boş = tüm bekleyen final bool tamamlandi; final String? hata; const ZamanlanmisGorev({ required this.id, required this.projeId, required this.projeIsmi, required this.zaman, this.hedefSegmentIdleri = const [], this.tamamlandi = false, this.hata, }); Map toJson() => { 'id': id, 'projeId': projeId, 'projeIsmi': projeIsmi, 'zaman': zaman.toIso8601String(), 'hedefSegmentIdleri': hedefSegmentIdleri, 'tamamlandi': tamamlandi, 'hata': hata, }; static ZamanlanmisGorev fromJson(Map j) => ZamanlanmisGorev( id: j['id'] as String, projeId: j['projeId'] as String, projeIsmi: j['projeIsmi'] as String, zaman: DateTime.parse(j['zaman'] as String), hedefSegmentIdleri: (j['hedefSegmentIdleri'] as List?) ?.cast() ?? [], tamamlandi: j['tamamlandi'] as bool? ?? false, hata: j['hata'] as String?, ); } class ZamanlanmisRender { static Box? _kutu; static Future _box() async => _kutu ??= await Hive.openBox('zamanlanmis_gorevler'); static Timer? _kontrolTimer; static Future> liste() async { final b = await _box(); final liste = []; for (final v in b.values) { try { liste.add(ZamanlanmisGorev.fromJson(Map.from(v as Map))); } catch (_) {} } liste.sort((a, b) => a.zaman.compareTo(b.zaman)); return liste; } static Future ekle(ZamanlanmisGorev g) async { final b = await _box(); await b.put(g.id, g.toJson()); } static Future sil(String id) async { final b = await _box(); await b.delete(id); } static Future guncelle(ZamanlanmisGorev g) async { final b = await _box(); await b.put(g.id, g.toJson()); } /// Periyodik kontrol başlat — her 30 saniyede bir bekleyen görevleri tarar static void baslat() { _kontrolTimer?.cancel(); _kontrolTimer = Timer.periodic(const Duration(seconds: 30), (_) async { await _kontrolEt(); }); // Hemen bir kez de kontrol et Future.microtask(_kontrolEt); } static Future _kontrolEt() async { final simdi = DateTime.now(); final gorevler = await liste(); for (final g in gorevler) { if (g.tamamlandi) continue; if (g.zaman.isAfter(simdi)) continue; Log.bilgi('ZamanlanmisRender', 'Görev tetikleniyor: ${g.projeIsmi}'); try { // Bu projedeki segmentleri kuyruğa al await JobOrkestratoru.ornek.ekle(Job( id: FikoYTId.yeni(), tip: JobTipi.topluUret, projeId: g.projeId, params: { 'segmentIdler': g.hedefSegmentIdleri, }, )); await guncelle(ZamanlanmisGorev( id: g.id, projeId: g.projeId, projeIsmi: g.projeIsmi, zaman: g.zaman, hedefSegmentIdleri: g.hedefSegmentIdleri, tamamlandi: true, )); } catch (e) { Log.hata('ZamanlanmisRender', 'Hata: $e'); await guncelle(ZamanlanmisGorev( id: g.id, projeId: g.projeId, projeIsmi: g.projeIsmi, zaman: g.zaman, hedefSegmentIdleri: g.hedefSegmentIdleri, tamamlandi: true, hata: e.toString(), )); } } } static void durdur() { _kontrolTimer?.cancel(); _kontrolTimer = null; } } final zamanlanmisGorevlerProvider = FutureProvider>((ref) => ZamanlanmisRender.liste());