/*
 * Copyright 2016 Open Networking Laboratory
 *
 * 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 org.onosproject.buckdaemon;

import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteStreams;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import static com.google.common.base.Preconditions.checkArgument;

/**
 * Context for executing a single Buck task.
 */
public class BuckTaskContext {

    private final String taskName;
    private final ImmutableList<String> input;
    private final List<String> output = new ArrayList<>();

    BuckTaskContext(InputStream inputString) throws IOException {
        String[] split = new String(ByteStreams.toByteArray(inputString)).split("\n");
        checkArgument(split.length >= 1, "Request must contain at least task type");
        this.taskName = split[0];
        ImmutableList.Builder<String> builder = ImmutableList.builder();
        for (int i = 1; i < split.length; i++) {
            builder.add(split[i]);
        }
        input = builder.build();
    }

    /**
     * Returns the symbolic task name.
     */
    public String taskName() {
        return taskName;
    }

    /**
     * Returns the input data a list of strings.
     *
     * @return input data
     */
    public List<String> input() {
        return ImmutableList.copyOf(input);
    }

    /**
     * Returns the output data a list of strings.
     *
     * @return output data
     */
    List<String> output() {
        return ImmutableList.copyOf(output);
    }

    /**
     * Adds a line to the output data.
     *
     * @param line line of output data
     */
    public void output(String line) {
        output.add(line);
    }

}
