import 'package:freezed_annotation/freezed_annotation.dart'; part 'prompt_parcalari.freezed.dart'; part 'prompt_parcalari.g.dart'; /// Karakterin görsel/fizyolojik prompt parçaları. Tutarlı görüntü için /// her sahnede tek string'e birleşip prompt'a enjekte edilir. @freezed class PromptParcalari with _$PromptParcalari { const PromptParcalari._(); const factory PromptParcalari({ @Default('') String sacRengi, @Default('') String sacTarzi, @Default('') String goz, @Default('') String yas, @Default('') String ten, @Default('') String vucut, String? etnisite, @Default('') String varsayilanKiyafet, @Default('') String varsayilanDurusRez, @Default([]) List ekEtiketler, }) = _PromptParcalari; factory PromptParcalari.fromJson(Map j) => _$PromptParcalariFromJson(j); /// Tüm parçaları virgülle ayırarak tek bir prompt fragmanına çevirir. String tekStringeCevir() { final parcalar = []; void ekle(String s) { final t = s.trim(); if (t.isNotEmpty) parcalar.add(t); } if (sacRengi.isNotEmpty || sacTarzi.isNotEmpty) { ekle('${sacRengi.trim()} ${sacTarzi.trim()}'.trim()); } ekle(goz); ekle(yas); ekle(ten); ekle(vucut); if (etnisite != null) ekle(etnisite!); ekle(varsayilanKiyafet); ekle(varsayilanDurusRez); parcalar.addAll(ekEtiketler.where((e) => e.trim().isNotEmpty)); return parcalar.join(', '); } }