package de.stadtbote.votian; import de.stadtbote.votian.database.DatabaseService; import java.util.*; import static de.stadtbote.votian.AdminSupport.*; import static de.stadtbote.votian.LegacyMapping.*; import static de.stadtbote.votian.OrderEntryService.fields; /** Explicit PHP contact-column settings; native defaults remain available without configuration. */ final class ContactPresentation { record Settings(List header,List body,List sort){} static Settings settings(DatabaseService db){var c=new OrderEntryCatalog(db);return new Settings(ContactVcard.positions(c.parameter(0,"MASK_CONTACT_HEADER_FIELDS_DISPLAYED"),2),ContactVcard.positions(c.parameter(0,"MASK_CONTACT_BODY_FIELDS_DISPLAYED"),200),ContactVcard.positions(c.parameter(0,"MASK_CONTACT_SORT_FIELDS"),200));} static List> ordered(List> definitions,List> values){ var byId=new HashMap>();for(var value:values)if(byId.put(id(value,"fieldId"),value)!=null)throw bad("Doppelte Kontaktfelder im Bestand. Bitte zuerst bereinigen."); return definitions.stream().map(d->{var row=byId.get(id(d,"id"));return row!=null?row:fields("fieldId",id(d,"id"),"label",text(d,"label"),"type",text(d,"type"),"value","");}).toList(); } static String value(List> fields,int index){return index> values){return s.header().isEmpty()?"":String.join(", ",s.header().stream().map(i->value(values,i)).filter(v->!v.isBlank()).toList());} static List body(Settings s,List> values){return s.body().isEmpty()?null:java.util.stream.IntStream.range(0,values.size()).filter(s.body()::contains).mapToObj(i->id(values.get(i),"fieldId")).toList();} static String sort(Settings s,List> values,long contact){return s.sort().isEmpty()?ContactService.contactName(values).toLowerCase(Locale.ROOT):String.join(":",s.sort().stream().map(i->value(values,i)).toList())+":"+contact;} }