/*
 * 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.usergrid.corepersistence.export;


import com.google.common.base.Optional;
import org.apache.usergrid.corepersistence.util.CpNamingUtils;
import org.apache.usergrid.persistence.core.scope.ApplicationScope;

import java.util.UUID;
import java.util.concurrent.TimeUnit;


/**
 * Index service request builder
 */
public class ExportRequestBuilderImpl implements ExportRequestBuilder {

    private Optional<UUID> withApplicationId = Optional.absent();
    private Optional<String> withCollectionName = Optional.absent();
    private Optional<String> cursor = Optional.absent();
    private Optional<Long> updateTimestamp = Optional.absent();
    private Optional<Integer> delayTimer = Optional.absent();
    private Optional<TimeUnit> timeUnitOptional = Optional.absent();


    /***
     *
     * @param applicationId The application id
     * @return
     */
    @Override
    public ExportRequestBuilder withApplicationId(final UUID applicationId ) {
        this.withApplicationId = Optional.fromNullable( applicationId );
        return this;
    }

    @Override
    public Optional<ApplicationScope> getApplicationScope() {

        if ( this.withApplicationId.isPresent() ) {
            return Optional.of( CpNamingUtils.getApplicationScope( withApplicationId.get() ) );
        }

        return Optional.absent();
    }

}
