/*
 * 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 io.prestosql.verifier;

import com.google.common.collect.ImmutableList;
import io.airlift.event.client.EventField;
import io.airlift.event.client.EventType;

import javax.annotation.concurrent.Immutable;

import java.util.List;

@Immutable
@EventType("VerifierQuery")
public class VerifierQueryEvent
{
    private final String suite;
    private final String runId;
    private final String source;
    private final String name;
    private final boolean failed;

    private final String testCatalog;
    private final String testSchema;
    private final List<String> testSetupQueries;
    private final String testQuery;
    private final List<String> testTeardownQueries;
    private final String testQueryId;
    private final Double testCpuTimeSecs;
    private final Double testWallTimeSecs;

    private final String controlCatalog;
    private final String controlSchema;
    private final List<String> controlSetupQueries;
    private final String controlQuery;
    private final List<String> controlTeardownQueries;
    private final String controlQueryId;
    private final Double controlCpuTimeSecs;
    private final Double controlWallTimeSecs;

    private final String errorMessage;

    public VerifierQueryEvent(
            String suite,
            String runId,
            String source,
            String name,
            boolean failed,
            String testCatalog,
            String testSchema,
            List<String> testSetupQueries,
            String testQuery,
            List<String> testTeardownQueries,
            String testQueryId,
            Double testCpuTimeSecs,
            Double testWallTimeSecs,
            String controlCatalog,
            String controlSchema,
            List<String> controlSetupQueries,
            String controlQuery,
            List<String> controlTeardownQueries,
            String controlQueryId,
            Double controlCpuTimeSecs,
            Double controlWallTimeSecs,
            String errorMessage)
    {
        this.suite = suite;
        this.runId = runId;
        this.source = source;
        this.name = name;
        this.failed = failed;

        this.testCatalog = testCatalog;
        this.testSchema = testSchema;
        this.testSetupQueries = ImmutableList.copyOf(testSetupQueries);
        this.testQuery = testQuery;
        this.testTeardownQueries = ImmutableList.copyOf(testTeardownQueries);
        this.testQueryId = testQueryId;
        this.testCpuTimeSecs = testCpuTimeSecs;
        this.testWallTimeSecs = testWallTimeSecs;

        this.controlCatalog = controlCatalog;
        this.controlSchema = controlSchema;
        this.controlSetupQueries = ImmutableList.copyOf(controlSetupQueries);
        this.controlQuery = controlQuery;
        this.controlTeardownQueries = ImmutableList.copyOf(controlTeardownQueries);
        this.controlQueryId = controlQueryId;
        this.controlCpuTimeSecs = controlCpuTimeSecs;
        this.controlWallTimeSecs = controlWallTimeSecs;

        this.errorMessage = errorMessage;
    }

    @EventField
    public String getSuite()
    {
        return suite;
    }

    @EventField
    public String getRunId()
    {
        return runId;
    }

    @EventField
    public String getSource()
    {
        return source;
    }

    @EventField
    public String getName()
    {
        return name;
    }

    @EventField
    public boolean isFailed()
    {
        return failed;
    }

    @EventField
    public String getTestCatalog()
    {
        return testCatalog;
    }

    @EventField
    public String getTestSchema()
    {
        return testSchema;
    }

    @EventField
    public String getTestQuery()
    {
        return testQuery;
    }

    @EventField
    public String getTestQueryId()
    {
        return testQueryId;
    }

    @EventField
    public Double getTestCpuTimeSecs()
    {
        return testCpuTimeSecs;
    }

    @EventField
    public Double getTestWallTimeSecs()
    {
        return testWallTimeSecs;
    }

    @EventField
    public String getControlCatalog()
    {
        return controlCatalog;
    }

    @EventField
    public String getControlSchema()
    {
        return controlSchema;
    }

    @EventField
    public String getControlQuery()
    {
        return controlQuery;
    }

    @EventField
    public String getControlQueryId()
    {
        return controlQueryId;
    }

    @EventField
    public Double getControlCpuTimeSecs()
    {
        return controlCpuTimeSecs;
    }

    @EventField
    public Double getControlWallTimeSecs()
    {
        return controlWallTimeSecs;
    }

    @EventField
    public String getErrorMessage()
    {
        return errorMessage;
    }

    @EventField
    public List<String> getTestSetupQueries()
    {
        return testSetupQueries;
    }

    @EventField
    public List<String> getTestTeardownQueries()
    {
        return testTeardownQueries;
    }

    @EventField
    public List<String> getControlSetupQueries()
    {
        return controlSetupQueries;
    }

    @EventField
    public List<String> getControlTeardownQueries()
    {
        return controlTeardownQueries;
    }
}
