/*
 * 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.maven.buildcache;

import org.apache.maven.buildcache.xml.Build;
import org.apache.maven.buildcache.xml.CacheSource;

import static java.util.Objects.requireNonNull;

/**
 * CacheResult
 */
public class CacheResult
{

    private final RestoreStatus status;

    private final Build build;

    private final CacheContext context;

    private CacheResult( RestoreStatus status, Build build, CacheContext context )
    {
        this.status = requireNonNull( status );
        this.build = build;
        this.context = context;
    }

    public static CacheResult empty( CacheContext context )
    {
        requireNonNull( context );
        return new CacheResult( RestoreStatus.EMPTY, null, context );
    }

    public static CacheResult empty()
    {
        return new CacheResult( RestoreStatus.EMPTY, null, null );
    }

    public static CacheResult failure( Build build, CacheContext context )
    {
        requireNonNull( build );
        requireNonNull( context );
        return new CacheResult( RestoreStatus.FAILURE, build, context );
    }

    public static CacheResult success( Build build, CacheContext context )
    {
        requireNonNull( build );
        requireNonNull( context );
        return new CacheResult( RestoreStatus.SUCCESS, build, context );
    }

    public static CacheResult partialSuccess( Build build, CacheContext context )
    {
        requireNonNull( build );
        requireNonNull( context );
        return new CacheResult( RestoreStatus.PARTIAL, build, context );
    }

    public static CacheResult failure( CacheContext context )
    {
        requireNonNull( context );
        return new CacheResult( RestoreStatus.FAILURE, null, context );
    }

    public static CacheResult rebuilded( CacheResult orig, Build build )
    {
        requireNonNull( orig );
        requireNonNull( build );
        return new CacheResult( orig.status, build, orig.context );
    }

    public boolean isSuccess()
    {
        return status == RestoreStatus.SUCCESS;
    }

    public Build getBuildInfo()
    {
        return build;
    }

    public CacheSource getSource()
    {
        return build != null ? build.getSource() : null;
    }

    public CacheContext getContext()
    {
        return context;
    }

    public boolean isPartialSuccess()
    {
        return status == RestoreStatus.PARTIAL;
    }

    public RestoreStatus getStatus()
    {
        return status;
    }

    public boolean isFinal()
    {
        return build != null && build.getDto().is_final();
    }
}
