package org.phenopackets.schema.v1.core;

import com.google.protobuf.util.JsonFormat;
import org.junit.jupiter.api.Test;
import org.phenopackets.schema.v1.Phenopacket;

/**
 * This class illustrates the usage of the Variant message for various genotypes.
 *
 * @author Jules Jacobsen <[email protected]>
 */
public class VariantTest {

    private static final OntologyClass HOM = OntologyClass.newBuilder().setId("GENO:0000136").setLabel("homozygous").build();
    private static final OntologyClass HET = OntologyClass.newBuilder().setId("GENO:0000135").setLabel("heterozygous").build();

    private static final VcfAllele FGFR2_PATH_ALLELE_1 = VcfAllele.newBuilder()
            .setGenomeAssembly("GRCh37")
            .setChr("10")
            .setPos(123256215)
            .setRef("T")
            .setAlt("G")
            .build();

    private static final VcfAllele FGFR2_LIKELY_PATH_ALLELE_2 = VcfAllele.newBuilder()
            .setGenomeAssembly("GRCh37")
            .setChr("10")
            .setPos(123247569)
            .setRef("T")
            .setAlt("C")
            .build();

    private static final Disease PFIEFFER_SYNDROME = Disease.newBuilder()
            .setTerm(OntologyClass.newBuilder().setId("OMIM:101600").setLabel("Pfeiffer syndrome").build())
            .build();

    private static final MetaData META_DATA = MetaData.newBuilder()
            .addResources(Resource.newBuilder()
                    .setId("geno")
                    .setName("Genotype Ontology")
                    .setNamespacePrefix("GENO")
                    .setIriPrefix("http://purl.obolibrary.org/obo/GENO_")
                    .setUrl("http://purl.obolibrary.org/obo/geno.owl")
                    .setVersion("19-03-2018")
                    .build())
            .addResources(Resource.newBuilder()
                    .setId("omim")
                    .setName("Online Mendelian Inheritance in Man")
                    .setNamespacePrefix("OMIM")
                    .setUrl("https://omim.org")
                    .setVersion("01-04-2019")
                    .build())
            .setCreatedBy("Jules J.")
            .build();

    @Test
    void homozygousVariant() throws Exception {
        Variant hom = Variant.newBuilder()
                .setVcfAllele(FGFR2_PATH_ALLELE_1)
                .setZygosity(HOM)
                .build();

        Phenopacket phenopacket = Phenopacket.newBuilder()
                .setId("pfeiffer_homozygous_case")
                .addVariants(hom)
                .addDiseases(PFIEFFER_SYNDROME)
                .setMetaData(META_DATA)
                .build();

        System.out.println(JsonFormat.printer().print(phenopacket));
    }

    @Test
    void heterozygousVariant() throws Exception {

        Variant het = Variant.newBuilder()
                .setVcfAllele(FGFR2_PATH_ALLELE_1)
                .setZygosity(HET)
                .build();

        Phenopacket phenopacket = Phenopacket.newBuilder()
                .setId("pfeiffer_heterozygous_case")
                .addVariants(het)
                .addDiseases(PFIEFFER_SYNDROME)
                .setMetaData(META_DATA)
                .build();

        System.out.println(JsonFormat.printer().print(phenopacket));
    }

    @Test
    void compoundHeterozygousVariant() throws Exception {

        Variant het1 = Variant.newBuilder()
                .setVcfAllele(FGFR2_PATH_ALLELE_1)
                .setZygosity(HET)
                .build();

        Variant het2 = Variant.newBuilder()
                .setVcfAllele(FGFR2_LIKELY_PATH_ALLELE_2)
                .setZygosity(HET)
                .build();

        Phenopacket phenopacket = Phenopacket.newBuilder()
                .setId("pfeiffer_compound_heterozygous_case")
                .addVariants(het1)
                .addVariants(het2)
                .addDiseases(PFIEFFER_SYNDROME)
                .setMetaData(META_DATA)
                .build();

        System.out.println(JsonFormat.printer().print(phenopacket));
    }
}