/*
 * 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.sling.commons.clam;

import org.jetbrains.annotations.NotNull;
import org.osgi.annotation.versioning.ProviderType;

@ProviderType
public class ScanResult {

    private final long timestamp = System.currentTimeMillis();

    private final Status status;

    private final String message;

    private final long started;

    private final long size;

    public ScanResult(@NotNull final Status status, @NotNull final String message, long started, long size) {
        this.status = status;
        this.message = message;
        this.started = started;
        this.size = size;
    }

    public long getTimestamp() {
        return timestamp;
    }

    @NotNull
    public Status getStatus() {
        return status;
    }

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

    public long getStarted() {
        return started;
    }

    public long getSize() {
        return size;
    }

    public boolean isOk() {
        return Status.OK.equals(status);
    }

    public enum Status {
        OK,
        FOUND,
        ERROR,
        UNKNOWN
    }

}
