package org.broadinstitute.hellbender.tools.coveragemodel.germline;

import org.broadinstitute.barclay.utils.Utils;
import org.broadinstitute.hellbender.tools.exome.Target;
import org.broadinstitute.hellbender.tools.exome.germlinehmm.IntegerCopyNumberState;
import org.broadinstitute.hellbender.tools.exome.sexgenotyper.GermlinePloidyAnnotatedTargetCollection;
import org.broadinstitute.hellbender.tools.exome.sexgenotyper.SexGenotypeData;

import javax.annotation.Nonnull;
import java.io.Serializable;
import java.util.function.BiFunction;

/**
 * This class implements a {@link BiFunction} that takes a sex genotype and a target and outputs the reference
 * integer copy number state, as an instance of {@link IntegerCopyNumberState}, for that sex genotype and target.
 *
 * @author Mehrtash Babadi <[email protected]>
 */
public class IntegerCopyNumberReferenceStateFactory implements BiFunction<SexGenotypeData, Target,
        IntegerCopyNumberState>, Serializable {

    private static final long serialVersionUID = 6322699892999789289L;

    private final GermlinePloidyAnnotatedTargetCollection germlinePloidyAnnotatedTargetCollection;

    public IntegerCopyNumberReferenceStateFactory(@Nonnull final GermlinePloidyAnnotatedTargetCollection
                                                          germlinePloidyAnnotatedTargetCollection) {
        this.germlinePloidyAnnotatedTargetCollection = Utils.nonNull(germlinePloidyAnnotatedTargetCollection);
    }

    @Override
    public IntegerCopyNumberState apply(@Nonnull final SexGenotypeData sexGenotypeData, @Nonnull final Target target) {
        return new IntegerCopyNumberState(germlinePloidyAnnotatedTargetCollection
                .getTargetGermlinePloidyByGenotype(target, sexGenotypeData.getSexGenotype()));
    }
}