package org.apache.maven.surefire.api.report;

/*
 * 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.
 */

import org.apache.maven.surefire.api.util.internal.ImmutableMap;

import java.util.Collections;
import java.util.Map;
import java.util.Objects;

/**
 * Basic implementation of {@link TestSetReportEntry} (immutable and thread-safe object).
 *
 * @author Kristian Rosenvold
 */
public class SimpleReportEntry
    implements TestSetReportEntry
{
    private final Map<String, String> systemProperties;

    private final String source;

    private final String sourceText;

    private final String name;

    private final String nameText;

    private final StackTraceWriter stackTraceWriter;

    private final Integer elapsed;

    private final String message;

    public SimpleReportEntry( String source, String sourceText, String name, String nameText )
    {
        this( source, sourceText, name, nameText, null, null );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText,
                              Map<String, String> systemProperties )
    {
        this( source, sourceText, name, nameText, null, null, systemProperties );
    }

    private SimpleReportEntry( String source, String sourceText, String name, String nameText,
                               StackTraceWriter stackTraceWriter )
    {
        this( source, sourceText, name, nameText, stackTraceWriter, null );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText, Integer elapsed )
    {
        this( source, sourceText, name, nameText, null, elapsed );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText, String message )
    {
        this( source, sourceText, name, nameText, null, null, message, Collections.<String, String>emptyMap() );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText,
                                 StackTraceWriter stackTraceWriter, Integer elapsed, String message,
                                 Map<String, String> systemProperties )
    {
        this.source = source;
        this.sourceText = sourceText;
        this.name = name;
        this.nameText = nameText;
        this.stackTraceWriter = stackTraceWriter;
        this.message = message;
        this.elapsed = elapsed;
        this.systemProperties = new ImmutableMap<>( systemProperties );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText,
                              StackTraceWriter stackTraceWriter, Integer elapsed )
    {
        this( source, sourceText, name, nameText, stackTraceWriter, elapsed, Collections.<String, String>emptyMap() );
    }

    public SimpleReportEntry( String source, String sourceText, String name, String nameText,
                              StackTraceWriter stackTraceWriter, Integer elapsed, Map<String, String> systemProperties )
    {
        this( source, sourceText, name, nameText,
                stackTraceWriter, elapsed, safeGetMessage( stackTraceWriter ), systemProperties );
    }

    public static SimpleReportEntry assumption( String source, String sourceText, String name, String nameText,
                                                String message )
    {
        return new SimpleReportEntry( source, sourceText, name, nameText, message );
    }

    public static SimpleReportEntry ignored( String source, String sourceText, String name, String nameText,
                                             String message )
    {
        return new SimpleReportEntry( source, sourceText, name, nameText, message );
    }

    public static SimpleReportEntry withException( String source, String sourceText, String name, String nameText,
                                                   StackTraceWriter stackTraceWriter )
    {
        return new SimpleReportEntry( source, sourceText, name, nameText, stackTraceWriter );
    }

    private static String safeGetMessage( StackTraceWriter stackTraceWriter )
    {
        try
        {
            SafeThrowable t = stackTraceWriter == null ? null : stackTraceWriter.getThrowable();
            return t == null ? null : t.getMessage();
        }
        catch ( Throwable t )
        {
            return t.getMessage();
        }
    }

    @Override
    public String getSourceName()
    {
        return source;
    }

    @Override
    public String getSourceText()
    {
        return sourceText;
    }

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

    @Override
    public String getNameText()
    {
        return nameText;
    }

    @Override
    public String getGroup()
    {
        return null;
    }

    @Override
    public StackTraceWriter getStackTraceWriter()
    {
        return stackTraceWriter;
    }

    @Override
    public Integer getElapsed()
    {
        return elapsed;
    }

    @Override
    public int getElapsed( int fallback )
    {
        return elapsed == null ? fallback : elapsed;
    }

    @Override
    public String toString()
    {
        return "ReportEntry{" + "source='" + source + "', sourceText='" + sourceText
                + "', name='" + name + "', nameText='" + nameText + "', stackTraceWriter='"
                + stackTraceWriter + "', elapsed='" + elapsed + "', message='" + message + "'}";
    }

    @Override
    public String getMessage()
    {
        return message;
    }

    @Override
    public boolean equals( Object o )
    {
        if ( this == o )
        {
            return true;
        }
        if ( o == null || getClass() != o.getClass() )
        {
            return false;
        }

        SimpleReportEntry that = (SimpleReportEntry) o;
        return isSourceEqual( that ) && isSourceTextEqual( that )
                && isNameEqual( that ) && isNameTextEqual( that )
                && isStackEqual( that )
                && isElapsedTimeEqual( that )
                && isSystemPropertiesEqual( that )
                && isMessageEqual( that );
    }

    @Override
    public int hashCode()
    {
        int result = Objects.hashCode( getSourceName() );
        result = 31 * result + Objects.hashCode( getSourceText() );
        result = 31 * result + Objects.hashCode( getName() );
        result = 31 * result + Objects.hashCode( getNameText() );
        result = 31 * result + Objects.hashCode( getStackTraceWriter() );
        result = 31 * result + Objects.hashCode( getElapsed() );
        result = 31 * result + Objects.hashCode( getSystemProperties() );
        result = 31 * result + Objects.hashCode( getMessage() );
        return result;
    }

    @Override
    public String getNameWithGroup()
    {
        return getSourceName();
    }

    @Override
    public String getReportNameWithGroup()
    {
        return getSourceText();
    }

    @Override
    public Map<String, String> getSystemProperties()
    {
        return systemProperties;
    }

    private boolean isElapsedTimeEqual( SimpleReportEntry en )
    {
        return Objects.equals( getElapsed(), en.getElapsed() );
    }

    private boolean isNameTextEqual( SimpleReportEntry en )
    {
        return Objects.equals( getNameText(), en.getNameText() );
    }

    private boolean isNameEqual( SimpleReportEntry en )
    {
        return Objects.equals( getName(), en.getName() );
    }

    private boolean isSourceEqual( SimpleReportEntry en )
    {
        return Objects.equals( getSourceName(), en.getSourceName() );
    }

    private boolean isSourceTextEqual( SimpleReportEntry en )
    {
        return Objects.equals( getSourceText(), en.getSourceText() );
    }

    private boolean isStackEqual( SimpleReportEntry en )
    {
        return Objects.equals( getStackTraceWriter(), en.getStackTraceWriter() );
    }

    private boolean isSystemPropertiesEqual( SimpleReportEntry en )
    {
        return Objects.equals( getSystemProperties(), en.getSystemProperties() );
    }

    private boolean isMessageEqual( SimpleReportEntry en )
    {
        return Objects.equals( getMessage(), en.getMessage() );
    }
}
