import 'dart:convert'; import 'dart:io'; import 'package:path/path.dart' as p; import '../models/personel.dart'; /// Yerel klasör bazlı depolama katmanı. /// /// Kart id -> alt klasör mantığı. Her kart id klasöründe: /// bilgi.json -> Personel verisi (+ base64 resim) /// durum.json -> bugünün giriş/çıkış durumu /// kayitlar.json -> tüm okuma kayıtları class Depolama { static Directory? _kokDizini; /// Uygulama exe'sinin bulunduğu klasörü kök dizin olarak döner. static Future kokDizini() async { if (_kokDizini != null) return _kokDizini!; // Platform.resolvedExecutable her zaman mutlak/normalize edilmiş bir yol // döner (Platform.executable bazı başlatma yöntemlerinde göreli olabiliyor // ve bu da '.\veri' gibi hatalı, erişimi engellenen yollara yol açıyordu). final exeKlasoru = p.dirname(Platform.resolvedExecutable); final kok = Directory(exeKlasoru); if (!kok.existsSync()) kok.createSync(recursive: true); _kokDizini = kok; return kok; } static Future veriKizini() async { final kok = await kokDizini(); final veri = Directory(p.join(kok.path, 'veri')); if (!veri.existsSync()) veri.createSync(recursive: true); return veri; } static Future personelKlasor(String id) async { final veri = await veriKizini(); final klasor = Directory(p.join(veri.path, 'personel', id)); if (!klasor.existsSync()) klasor.createSync(recursive: true); return klasor; } /// veri/personel// klasöründeki tüm personelleri listeler. static Future> tumPersoneller() async { final veri = await veriKizini(); final personelDir = Directory(p.join(veri.path, 'personel')); if (!personelDir.existsSync()) return []; final sonuc = []; for (final entry in personelDir.listSync()) { if (entry is! Directory) continue; final bilgi = File(p.join(entry.path, 'bilgi.json')); if (!bilgi.existsSync()) continue; try { final j = jsonDecode(_biliyiOku(bilgi)) as Map; sonuc.add(Personel.fromJson(j)); } catch (_) { // Bozuk kayıt, atla } } sonuc.sort((a, b) => a.isim.toLowerCase().compareTo(b.isim.toLowerCase())); return sonuc; } static String _biliyiOku(File file) => file.readAsStringSync(); /// Bugünkü durumu getirir (dosya yoksa varsayılan: giriş yapmamış). static Future bugunDurumu(String id) async { final klasor = await personelKlasor(id); final durum = File(p.join(klasor.path, 'durum.json')); if (!durum.existsSync()) { return GunDurumu(personelId: id, uid: id, girisYapti: false); } try { final j = jsonDecode(_biliyiOku(durum)) as Map; return GunDurumu.fromJson(j); } catch (_) { return GunDurumu(personelId: id, uid: id, girisYapti: false); } } /// Bugünkü durumu kaydeder. static Future bugunDurumuKaydet(GunDurumu durum) async { final klasor = await personelKlasor(durum.personelId); await File(p.join(klasor.path, 'durum.json')).writeAsString( jsonEncode(durum.toJson()), encoding: utf8, ); } /// Bugüne ait kayıtları yükler (son zaman sırasına göre). static Future> bugunKayitlari(String id) async { final klasor = await personelKlasor(id); final kayitlar = File(p.join(klasor.path, 'kayitlar.json')); if (!kayitlar.existsSync()) return []; try { final list = jsonDecode(_biliyiOku(kayitlar)) as List; return list .map((j) => OkumaKaydi.fromJson(j as Map)) .toList() ..sort((a, b) => b.zaman.compareTo(a.zaman)); } catch (_) { return []; } } /// Yeni bir okuma kaydı ekler. static Future kayitEk(OkumaKaydi kayit) async { final klasor = await personelKlasor(kayit.personelId); final kayitlar = File(p.join(klasor.path, 'kayitlar.json')); final list = >[]; if (kayitlar.existsSync()) { try { final parsed = jsonDecode(_biliyiOku(kayitlar)) as List; for (final j in parsed) { list.add(j as Map); } } catch (_) {} } list.insert(0, kayit.toJson()); await kayitlar.writeAsString( jsonEncode(list), encoding: utf8, ); } /// Bir personeli klasörüne kaydeder, resmi bilgi.json içine base64 olarak gömer. static Future personeliKaydet( Personel personel, { String? resimBase64, }) async { final klasor = await personelKlasor(personel.id); final kaydedilen = Personel( id: personel.id, isim: personel.isim, departman: personel.departman, pozisyon: personel.pozisyon, resimBase64: resimBase64, ); await File(p.join(klasor.path, 'bilgi.json')).writeAsString( jsonEncode(kaydedilen.toJson()), encoding: utf8, ); return kaydedilen; } /// Bir personelin klasörünü siler. static Future personeliSil(String id) async { final klasor = await personelKlasor(id); if (klasor.existsSync()) klasor.deleteSync(recursive: true); } }