package com.android.cts.verifier.tv.display;


import com.android.cts.verifier.tv.TvAppVerifierActivity;

import java.util.List;
import java.util.stream.Collectors;

/**
 * A sequence of {@link TestStepBase}s within a {@link TvAppVerifierActivity}, which are meant to be
 * executed one after another. The whole sequence passes if all containing test steps pass.
 */
public class TestSequence {
    private List<TestStepBase> steps;
    private TvAppVerifierActivity context;

    /**
     * @param context The TvAppVerifierActivity containing this sequence.
     * @param steps List of the steps contained in the sequence.
     */
    public TestSequence(TvAppVerifierActivity context, List<TestStepBase> steps) {
        this.context = context;
        this.steps = steps;
    }

    /**
     * Initializes the steps in the sequence by creating their UI components, ensuring they can be
     * executed only in the given order and properly enable the pass/fails buttons of the
     * surrounding {@link TvAppVerifierActivity}. This method should be called in the
     * createTestItems() method of the {@link TvAppVerifierActivity} which contains this sequence.
     */
    public void init() {
        if (steps.isEmpty()) {
            return;
        }

        // Initialize all containing test steps.
        steps.stream().forEach(step -> step.createUiElements());

        // After a step is completed we enable the button of the next step.
        for (int i = 0; i < steps.size() - 1; i++) {
            final int next = i + 1;
            steps.get(i).setOnDoneListener(() -> steps.get(next).enableButton());
        }

        // When the last step is done, mark the sequence as done.
        steps.get(steps.size() - 1)
                .setOnDoneListener(() -> onAllStepsDone());

        // Enable the button of the first test step so the user can start it.
        steps.get(0).enableButton();
    }

    public String getFailureDetails() {
        return steps.stream()
                .filter(step -> !step.hasPassed())
                .map(step -> step.getFailureDetails())
                .collect(Collectors.joining("\n"));
    }

    private void onAllStepsDone() {
        // The sequence passes if all containing test steps pass.
        boolean allTestStepsPass = steps.stream().allMatch(step -> step.hasPassed());
        context.getPassButton().setEnabled(allTestStepsPass);
    }
}