/*
 * Copyright (c) 2022 MiLaboratories Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.milaboratory.core;

import com.milaboratory.core.sequence.NSequenceWithQuality;

public final class Target {
    private static final byte[] SINGLE_FORWARD = new byte[]{+1};
    private static final byte[] SINGLE_REVERSED = new byte[]{-1};
    public final NSequenceWithQuality[] targets;
    /**
     * -2 for RC R2
     * -1 for RC R1
     * +1 for Direct R1
     * +2 for Direct R2
     */
    private final byte[] readIds;

    Target(NSequenceWithQuality target, boolean reversed) {
        this.targets = new NSequenceWithQuality[]{target};
        this.readIds = reversed ? SINGLE_REVERSED : SINGLE_FORWARD;
    }

    Target(NSequenceWithQuality target1, NSequenceWithQuality target2, byte[] readIds) {
        this.targets = new NSequenceWithQuality[]{target1, target2};
        this.readIds = readIds;
    }

    /**
     * 1 for SingleRead input or 2 for PairedRead input
     */
    public int numberOfParts() {
        return readIds.length;
    }

    /**
     * @param targetId 0 or 1
     * @return 0 for R1, 1 for R2
     */
    public int getReadIdOfTarget(int targetId) {
        return Math.abs(readIds[targetId]) - 1;
    }

    /**
     * {@literal true} for RC, {@literal false} for Direct
     *
     * @param targetId 0 or 1
     * @return {@literal true} for RC, {@literal false} for Direct
     */
    public boolean getRCStateOfTarget(int targetId) {
        return readIds[targetId] < 0;
    }

    public byte getFullSourceId(int targetId) {
        return readIds[targetId];
    }
}
