/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.skywalking.plugin.test.agent.tool.validator.assertor.exception;

import java.util.List;
import org.apache.skywalking.plugin.test.agent.tool.validator.assertor.SegmentPredictionFailedCause;
import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Segment;
import org.apache.skywalking.plugin.test.agent.tool.validator.entity.Span;
import org.apache.skywalking.plugin.test.agent.tool.validator.exception.AssertFailedException;

public class SegmentNotFoundException extends AssertFailedException {
    private final Segment expectedSegment;
    private final List<SegmentPredictionFailedCause> failedCauses;

    public SegmentNotFoundException(Segment expectedSegment, List<SegmentPredictionFailedCause> failedCauses) {
        this.expectedSegment = expectedSegment;
        this.failedCauses = failedCauses;
    }

    @Override
    public String getCauseMessage() {
        StringBuilder expectedMessage = new StringBuilder("\n  Segment:\n");
        for (Span span : expectedSegment.spans()) {
            expectedMessage.append(String.format("  - span[%s, %s] %s\n", span.parentSpanId(), span.spanId(), span.operationName()));
        }

        StringBuilder causeMessage = new StringBuilder();
        for (SegmentPredictionFailedCause cause : failedCauses) {
            Segment actualSegment = cause.getActualSegment();
            Span actualSpan = cause.getSpanAssertFailedCause().getActualSpan();
            Span expectedSpan = cause.getSpanAssertFailedCause().getExceptedSpan();

            causeMessage.append(String.format("\n  Segment[%s] e\n  expected:\tSpan[%s, %s] %s\n  " + "actual:" + "\tspan[%s, %s] %s\n  reason:\t%s\n", actualSegment
                .segmentId(), expectedSpan.parentSpanId(), expectedSpan.spanId(), expectedSpan.operationName(), actualSpan
                .parentSpanId(), actualSpan.spanId(), actualSpan.operationName(), cause.getSpanAssertFailedCause()
                                                                                       .getCauseMessage()));
        }

        return String.format("SegmentNotFoundException:\nexpected: %s\nactual: %s\n", expectedMessage, causeMessage);
    }
}
