package org.phenopackets.schema.v1.examples;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
import com.google.protobuf.Timestamp;
import com.google.protobuf.util.JsonFormat;
import org.junit.jupiter.api.Test;
import org.phenopackets.schema.v1.Phenopacket;
import org.phenopackets.schema.v1.core.*;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Sandbox {



    @Test
    void testTimeStamp() {
        long millis  = System.currentTimeMillis();
        Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
                .setNanos((int) ((millis % 1000) * 1000000)).build();

    }


    @Test
    void testSpecificData() throws Exception {
        //SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String hastings = "1066-10-14";
        Date date = formatter.parse(hastings);
        long millis = date.getTime();
        Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
                .setNanos((int) ((millis % 1000) * 1000000)).build();
        System.out.println(JsonFormat.printer().includingDefaultValueFields().print(timestamp));
    }


    @Test
    void testEvidence() throws Exception {
        OntologyClass publishedClinicalStudy = OntologyClass.
                newBuilder().
                setId("ECO:0006017").
                setLabel("author statement from published clinical study used in manual assertion").
                build();
        ExternalReference reference = ExternalReference.newBuilder().
                setId("PMID:20375004").
                setDescription("Mutations in fibrillin-1 cause congenital scleroderma: stiff skin syndrome").
                build();
        Evidence evidence = Evidence.newBuilder().
                setEvidenceCode(publishedClinicalStudy).
                setReference(reference).
                build();
        System.out.println(JsonFormat.printer().includingDefaultValueFields().print(evidence));
    }


    @Test
    void testProcedure() throws Exception {
        OntologyClass biopsySoftPalate = OntologyClass.newBuilder().
                setId("NCIT:C51585").
                setLabel("Biopsy of Soft Palate").
                build();
        Procedure procedure1 = Procedure.newBuilder().
                setCode(biopsySoftPalate).
                build();
        Biosample bs = Biosample.newBuilder().
                setProcedure(procedure1).
                build();
        System.out.println(JsonFormat.printer().includingDefaultValueFields().print(bs));

        OntologyClass punchBiopsy = OntologyClass.newBuilder().
                setId("NCIT:C28743").
                setLabel("Punch Biopsy").
                build();
        OntologyClass skinOfForearm = OntologyClass.newBuilder().
                setId("UBERON:0003403").
                setLabel("skin of forearm").
                build();
        Procedure procedure2 = Procedure.newBuilder().
                setCode(punchBiopsy).
                setBodySite(skinOfForearm).
                build();
        System.out.println(JsonFormat.printer()
                .print(Biosample.newBuilder().
                        setProcedure(procedure2).
                        build()));
    }

    @Test
    void testDisease() throws Exception{
        OntologyClass HPMRS1 = OntologyClass.newBuilder().
                setId("OMIM:239300").
                setLabel("Hyperphosphatasia with mental retardation syndrome 1").
                build();
        OntologyClass neonatalOnset = OntologyClass.newBuilder().
                setId("HP:0003623").
                setLabel("Neonatal onset").
                build();
        Disease disease = Disease.newBuilder().
                setTerm(HPMRS1).
                setClassOfOnset(neonatalOnset).
                build();
        Disease disease2 = Disease.newBuilder().
                setTerm(HPMRS1).
                setClassOfOnset(neonatalOnset).
                build();
        Phenopacket pp = Phenopacket.newBuilder().
                addDiseases(disease).
                addDiseases(disease2).
                build();
        System.out.println(JsonFormat.printer().includingDefaultValueFields().print(pp));

    }


    @Test void test1() {
        Phenopacket phenoPacket = Phenopacket.newBuilder().build();
        try {
            System.out.println(JsonFormat.printer().includingDefaultValueFields().print(phenoPacket));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    @Test void test22() throws IOException {
        OntologyClass biopsySoftPalate = OntologyClass.newBuilder().
                setId("NCIT:C51585").
                setLabel("Biopsy of Soft Palate").
                build();
        String JSONString = JsonFormat.printer().includingDefaultValueFields().print(biopsySoftPalate);
        JsonNode jsonNodeTree = new ObjectMapper().readTree(JSONString);
        String yamlString = new YAMLMapper().writeValueAsString(jsonNodeTree);
        System.out.println(yamlString);

        biopsySoftPalate.writeTo(System.out);


    }


}