// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientAccount.java
// @Data
// public class PatientAccount implements Snapshot<Patient, Long, Long, PatientEvent>, // <1>
//         Serializable {
//     private Long id;
//     private Patient aggregate;
//     private Patient deprecatedBy;
//     private List<Patient> deprecates = new ArrayList<>();
//     private long lastEventPosition; // <2>
//     private Date lastEventTimestamp; // <3>
// 
//     private String name;
//     private BigDecimal balance = new BigDecimal(0);
//     private BigDecimal moneyMade = new BigDecimal(0);
// 
//     // end::documented[]
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getAggregateObservable() { // <4>
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// 
//     // end::documented[]
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getDeprecatedByObservable() { // <5>
//         return toPublisher(deprecatedBy != null ? just(deprecatedBy) : empty());
//     }
// 
//     // end::documented[]
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getDeprecatesObservable() { // <6>
//         return toPublisher(from(deprecates));
//     }
//     // end::documented[]
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "PatientAccount{id=%d, aggregate=%s, lastEventPosition=%d, lastEventTimestamp=%s}",
//                 id, aggregate, lastEventPosition, lastEventTimestamp);
//     }
// 
//     // tag::documented[]
// }
// 
// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientEvent.java
// @Data
// public abstract class PatientEvent implements BaseEvent<Patient, Long, PatientEvent> { // <1>
//     private Patient aggregate;
//     private Long id;
//     private RevertEvent<Patient, Long, PatientEvent> revertedBy;  // <2>
//     private Date timestamp; // <3>
//     private long position; // <4>
// 
//     // end::documented[]
//     @XmlTransient
//     // tag::documented[]
//     @Override
//     @NotNull
//     public Publisher<Patient> getAggregateObservable() { // <5>
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// }
// 
// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientHealth.java
// @Data
// public class PatientHealth
//         implements Snapshot<Patient, Long, Long, PatientEvent>, Serializable {
//     private List<Procedure> procedures = new ArrayList<>();
//     private Long id;
//     private Patient aggregate;
//     private Patient deprecatedBy;
//     private List<Patient> deprecates = new ArrayList<>();
//     private long lastEventPosition;
//     private Date lastEventTimestamp;
// 
//     private String name;
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getAggregateObservable() {
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getDeprecatedByObservable() {
//         return toPublisher(deprecatedBy != null ? just(deprecatedBy) : empty());
//     }
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getDeprecatesObservable() {
//         return toPublisher(from(deprecates));
//     }
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "PatientHealth{id=%d, aggregate=%s, lastEventPosition=%d, lastEventTimestamp=%s}",
//                 id, aggregate, lastEventPosition, lastEventTimestamp);
//     }
// 
//     @Data
//     public static class Procedure implements Serializable {
//         private final String code;
//         private final Date date;
//     }
// }


import grooves.example.javaee.domain.PatientAccount;
import grooves.example.javaee.domain.PatientEvent;
import grooves.example.javaee.domain.PatientHealth;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.List;
import static java.util.stream.Collectors.toList;
package grooves.example.javaee;




/**
 * Created by rahul on 5/28/17.
 */
@Path("/debug")
public class DebugResource {
    @Inject
    private Database database;

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/events")
    public List<PatientEvent> list() {
        return database.events().collect(toList());
    }

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/account")
    public List<PatientAccount> account() {
        return database.snapshots(PatientAccount.class).collect(toList());
    }

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/health")
// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientAccount.java
// @Data
// public class PatientAccount implements Snapshot<Patient, Long, Long, PatientEvent>, // <1>
//         Serializable {
//     private Long id;
//     private Patient aggregate;
//     private Patient deprecatedBy;
//     private List<Patient> deprecates = new ArrayList<>();
//     private long lastEventPosition; // <2>
//     private Date lastEventTimestamp; // <3>
// 
//     private String name;
//     private BigDecimal balance = new BigDecimal(0);
//     private BigDecimal moneyMade = new BigDecimal(0);
// 
//     // end::documented[]
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getAggregateObservable() { // <4>
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// 
//     // end::documented[]
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getDeprecatedByObservable() { // <5>
//         return toPublisher(deprecatedBy != null ? just(deprecatedBy) : empty());
//     }
// 
//     // end::documented[]
//     @NotNull
//     @Override
//     @XmlTransient
//     // tag::documented[]
//     public Publisher<Patient> getDeprecatesObservable() { // <6>
//         return toPublisher(from(deprecates));
//     }
//     // end::documented[]
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "PatientAccount{id=%d, aggregate=%s, lastEventPosition=%d, lastEventTimestamp=%s}",
//                 id, aggregate, lastEventPosition, lastEventTimestamp);
//     }
// 
//     // tag::documented[]
// }
// 
// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientEvent.java
// @Data
// public abstract class PatientEvent implements BaseEvent<Patient, Long, PatientEvent> { // <1>
//     private Patient aggregate;
//     private Long id;
//     private RevertEvent<Patient, Long, PatientEvent> revertedBy;  // <2>
//     private Date timestamp; // <3>
//     private long position; // <4>
// 
//     // end::documented[]
//     @XmlTransient
//     // tag::documented[]
//     @Override
//     @NotNull
//     public Publisher<Patient> getAggregateObservable() { // <5>
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// }
// 
// Path: examples/javaee/src/main/java/grooves/example/javaee/domain/PatientHealth.java
// @Data
// public class PatientHealth
//         implements Snapshot<Patient, Long, Long, PatientEvent>, Serializable {
//     private List<Procedure> procedures = new ArrayList<>();
//     private Long id;
//     private Patient aggregate;
//     private Patient deprecatedBy;
//     private List<Patient> deprecates = new ArrayList<>();
//     private long lastEventPosition;
//     private Date lastEventTimestamp;
// 
//     private String name;
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getAggregateObservable() {
//         return toPublisher(aggregate != null ? just(aggregate) : empty());
//     }
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getDeprecatedByObservable() {
//         return toPublisher(deprecatedBy != null ? just(deprecatedBy) : empty());
//     }
// 
//     @NotNull
//     @Override
//     @XmlTransient
//     public Publisher<Patient> getDeprecatesObservable() {
//         return toPublisher(from(deprecates));
//     }
// 
//     @Override
//     public String toString() {
//         return String.format(
//                 "PatientHealth{id=%d, aggregate=%s, lastEventPosition=%d, lastEventTimestamp=%s}",
//                 id, aggregate, lastEventPosition, lastEventTimestamp);
//     }
// 
//     @Data
//     public static class Procedure implements Serializable {
//         private final String code;
//         private final Date date;
//     }
// }


// Path: examples/javaee/src/main/java/grooves/example/javaee/DebugResource.java
import grooves.example.javaee.domain.PatientAccount;
import grooves.example.javaee.domain.PatientEvent;
import grooves.example.javaee.domain.PatientHealth;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.List;
import static java.util.stream.Collectors.toList;

package grooves.example.javaee;




/**
 * Created by rahul on 5/28/17.
 */
@Path("/debug")
public class DebugResource {
    @Inject
    private Database database;

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/events")
    public List<PatientEvent> list() {
        return database.events().collect(toList());
    }

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/account")
    public List<PatientAccount> account() {
        return database.snapshots(PatientAccount.class).collect(toList());
    }

    /**
     * Lists all patients.
     *
     * @return List of patients
     */
    @GET
    @Produces("application/json")
    @Path("/health")
    public List<PatientHealth> health() {