001package org.hl7.fhir.r4.ips;
002
003import java.io.IOException;
004import java.util.HashMap;
005import java.util.List;
006import java.util.Map;
007
008import org.hl7.fhir.r4.ips.IPSRenderer.InternalTemplateEngine;
009import org.hl7.fhir.r4.model.Bundle;
010import org.hl7.fhir.r4.model.Composition;
011import org.hl7.fhir.r4.model.Composition.SectionComponent;
012import org.hl7.fhir.r4.model.DomainResource;
013import org.hl7.fhir.r4.model.Reference;
014import org.hl7.fhir.r4.terminologies.TerminologyClient;
015import org.hl7.fhir.utilities.MarkedToMoveToAdjunctPackage;
016import org.hl7.fhir.utilities.xhtml.NodeType;
017import org.hl7.fhir.utilities.xhtml.XhtmlComposer;
018import org.hl7.fhir.utilities.xhtml.XhtmlNode;
019
020@MarkedToMoveToAdjunctPackage
021public class IPSRenderer {
022
023  public class InternalTemplateEngine implements ITemplateImplementer {
024
025    @Override
026    public String buildPage(Map<String, String> headers, String content) {
027      // TODO Auto-generated method stub
028      return null;
029    }
030
031  }
032
033  private interface ITemplateImplementer {
034    public String buildPage(Map<String, String> headers, String content);
035  }
036  private TerminologyClient tx;
037  private String folder; // for images etc
038  private Map<String, byte[]> binaries; // from the pubpack
039  private ITemplateImplementer templater;
040  private Map<String, String> headers;
041
042  public IPSRenderer(TerminologyClient tx, String folder, Map<String, byte[]> binaries, ITemplateImplementer templater) {
043    super();
044    this.tx = tx;
045    this.folder = folder;
046    this.binaries = binaries;
047    this.templater = templater;
048  }
049  
050  public IPSRenderer(TerminologyClient tx, String folder, Map<String, byte[]> binaries) {
051    super();
052    this.tx = tx;
053    this.folder = folder;
054    this.binaries = binaries;
055    this.templater = new InternalTemplateEngine();
056  }
057
058  public String render(Bundle document) throws IOException {
059    headers = new HashMap<>();
060    XhtmlNode x = new XhtmlNode(NodeType.Element, "div");
061    generate(x, document);
062    return templater.buildPage(headers, new XhtmlComposer(false, true).compose(x));
063  }
064
065  private void generate(XhtmlNode x, Bundle document) {
066    Composition cmp = (Composition) document.getEntryFirstRep().getResource();
067    int sectionDepth = findSectionDepth(cmp.getSection());
068    XhtmlNode table = x.table("grid");
069    
070    // row 1: header
071    XhtmlNode tr = table.tr();
072    XhtmlNode td = tr.td().colspan(1+sectionDepth);
073    td.b().tx("Provided");
074    td = tr.td().colspan(1+sectionDepth);
075    td.b().tx("Generated");
076    
077    // row 2: Subject
078    DomainResource subject = findResource(document, cmp.getSubject());
079    tr = table.tr();
080    td = tr.td().colspan(1+sectionDepth);
081    // genNarrative("subject", subject, td);
082    td = tr.td().colspan(1+sectionDepth);
083    td.b().tx("Generated");
084    
085    
086    
087    
088  }
089
090  private DomainResource findResource(Bundle document, Reference subject) {
091    // TODO Auto-generated method stub
092    return null;
093  }
094
095  private int findSectionDepth(List<SectionComponent> list) {
096    int i = 1;
097    for (SectionComponent sect : list) {
098      i = Integer.max(i, 1+findSectionDepth(sect.getSection()));
099    }
100    return i;
101  }
102}