// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.impl.google.namespace;

import io.v.v23.rpc.Callback;
import org.joda.time.Duration;

import java.util.List;
import java.util.Map;

import io.v.v23.Options;
import io.v.v23.context.VContext;
import io.v.v23.namespace.Namespace;
import io.v.v23.naming.GlobReply;
import io.v.v23.naming.MountEntry;
import io.v.v23.security.access.Permissions;
import io.v.v23.verror.VException;

/**
 * An implementation of {@link Namespace} that calls to native code for most of its
 * functionalities.
 */
public class NamespaceImpl implements Namespace {
    private final long nativePtr;

    private static native Iterable<GlobReply> nativeGlob(
            long nativePtr, VContext context, String pattern, Options options) throws VException;

    private static native void nativeGlobAsync(long nativePtr, VContext context, String pattern,
                                               Options options, Callback<Iterable<GlobReply>>
                                                       callback) throws VException;

    private static native void nativeMount(long nativePtr, VContext context, String name,
                                           String server, Duration ttl, Options options)
            throws VException;

    private static native void nativeMountAsync(long nativePtr, VContext context, String name,
                                                String server, Duration ttl, Options options,
                                                Callback<Void> callback) throws VException;

    private static native void nativeUnmount(long nativePtr, VContext context, String name,
                                             String server, Options options) throws VException;

    private static native void nativeUnmountAsync(long nativePtr, VContext context, String name,
                                                  String server, Options options, Callback<Void>
                                                          callback) throws VException;

    private static native void nativeDelete(long nativePtr, VContext context, String name,
                                            boolean deleteSubtree, Options options)
            throws VException;

    private static native void nativeDeleteAsync(long nativePtr, VContext context, String name,
                                                 boolean deleteSubtree, Options options,
                                                 Callback<Void> callback) throws VException;

    private static native MountEntry nativeResolveToMountTable(long nativePtr, VContext context,
                                                               String name, Options options)
            throws VException;

    private static native void nativeResolveToMountTableAsync(long nativePtr, VContext context,
                                                              String name, Options options,
                                                              Callback<MountEntry> callback)
            throws VException;

    private static native MountEntry nativeResolve(long nativePtr, VContext context, String name,
                                                   Options options) throws VException;

    private static native void nativeResolveAsync(long nativePtr, VContext context, String name,
                                                  Options options, Callback<MountEntry> callback)
            throws VException;

    private static native boolean nativeFlushCacheEntry(long nativePtr, VContext context,
                                                        String name);

    private static native void nativeSetRoots(long nativePtr, List<String> roots) throws VException;

    private static native void nativeSetPermissions(long nativePtr, VContext context, String name,
                                                    Permissions permissions, String version,
                                                    Options options) throws VException;

    private static native void nativeSetPermissionsAsync(long nativePtr, VContext context, String
            name, Permissions permissions, String version, Options options, Callback<Void>
            callback) throws VException;

    private static native Map<String, Permissions> nativeGetPermissions(long nativePtr,
                                                                        VContext context,
                                                                        String name,
                                                                        Options options)
            throws VException;

    private static native void nativeGetPermissionsAsync(long nativePtr, VContext context, String
            name, Options options, Callback<Map<String, Permissions>> callback) throws VException;

    private native void nativeFinalize(long nativePtr);

    private NamespaceImpl(long nativePtr) {
        this.nativePtr = nativePtr;
    }

    @Override
    public void mount(VContext context, String name, String server, Duration ttl)
            throws VException {
        mount(context, name, server, ttl, (Options) null);
    }

    @Override
    public void mount(VContext context, String name, String server, Duration ttl, Options options)
            throws VException {
        nativeMount(nativePtr, context, name, server, ttl, options);
    }

    @Override
    public void mount(VContext context, String name, String server, Duration ttl, Callback<Void>
            callback) throws VException {
        mount(context, name, server, ttl, null, callback);
    }

    @Override
    public void mount(VContext context, String name, String server, Duration ttl, Options
            options, Callback<Void> callback) throws VException {
        nativeMountAsync(nativePtr, context, name, server, ttl, options, callback);
    }

    @Override
    public void unmount(VContext context, String name, String server) throws VException {
        unmount(context, name, server, (Options) null);
    }

    @Override
    public void unmount(VContext context, String name, String server, Options options)
            throws VException {
        nativeUnmount(nativePtr, context, name, server, options);
    }

    @Override
    public void unmount(VContext context, String name, String server, Callback<Void> callback)
            throws VException {
        unmount(context, name, server, null, callback);
    }

    @Override
    public void unmount(VContext context, String name, String server, Options options,
                        Callback<Void> callback) throws VException {
        nativeUnmountAsync(nativePtr, context, name, server, options, callback);
    }

    @Override
    public void delete(VContext context, String name, boolean deleteSubtree) throws VException {
        delete(context, name, deleteSubtree, (Options) null);
    }

    @Override
    public void delete(VContext context, String name, boolean deleteSubtree, Options options)
            throws VException {
        nativeDelete(nativePtr, context, name, deleteSubtree, options);
    }

    @Override
    public void delete(VContext context, String name, boolean deleteSubtree, Callback<Void>
            callback) throws VException {
        delete(context, name, deleteSubtree, null, callback);
    }

    @Override
    public void delete(VContext context, String name, boolean deleteSubtree, Options options,
                       Callback<Void> callback) throws VException {
        nativeDeleteAsync(nativePtr, context, name, deleteSubtree, options, callback);
    }

    @Override
    public MountEntry resolve(VContext context, String name) throws VException {
        return resolve(context, name, (Options) null);
    }

    @Override
    public MountEntry resolve(VContext context, String name, Options options) throws VException {
        return nativeResolve(nativePtr, context, name, options);
    }

    @Override
    public void resolve(VContext context, String name, Callback<MountEntry> callback) throws
            VException {
        resolve(context, name, null, callback);
    }

    @Override
    public void resolve(VContext context, String name, Options options, Callback<MountEntry>
            callback) throws VException {
        nativeResolveAsync(nativePtr, context, name, options, callback);
    }

    @Override
    public MountEntry resolveToMountTable(VContext context, String name) throws VException {
        return resolveToMountTable(context, name, (Options) null);
    }

    @Override
    public MountEntry resolveToMountTable(VContext context, String name, Options options)
            throws VException {
        return nativeResolveToMountTable(nativePtr, context, name, options);
    }

    @Override
    public void resolveToMountTable(VContext context, String name, Callback<MountEntry> callback)
            throws VException {
        resolveToMountTable(context, name, null, callback);
    }

    @Override
    public void resolveToMountTable(VContext context, String name, Options options,
                                    Callback<MountEntry> callback)
            throws VException {
        nativeResolveToMountTableAsync(nativePtr, context, name, options, callback);
    }

    @Override
    public boolean flushCacheEntry(VContext context, String name) {
        return nativeFlushCacheEntry(nativePtr, context, name);
    }

    @Override
    public Iterable<GlobReply> glob(VContext context, String pattern) throws VException {
        return glob(context, pattern, (Options) null);
    }

    @Override
    public Iterable<GlobReply> glob(VContext context, String pattern, Options options)
            throws VException {
        return nativeGlob(nativePtr, context, pattern, options);
    }

    @Override
    public void glob(VContext context, String pattern, Callback<Iterable<GlobReply>> callback)
            throws VException {
        glob(context, pattern, null, callback);
    }

    @Override
    public void glob(VContext context, String pattern, Options options,
                     Callback<Iterable<GlobReply>> callback) throws VException {
        nativeGlobAsync(nativePtr, context, pattern, options, callback);
    }


    @Override
    public void setRoots(List<String> roots) throws VException {
        nativeSetRoots(nativePtr, roots);
    }

    @Override
    public void setPermissions(VContext context, String name, Permissions permissions,
                               String version) throws VException {
        setPermissions(context, name, permissions, version, (Options) null);
    }

    @Override
    public void setPermissions(VContext context, String name, Permissions permissions,
                               String version, Options options) throws VException {
        nativeSetPermissions(nativePtr, context, name, permissions, version, options);
    }

    @Override
    public void setPermissions(VContext context, String name, Permissions permissions,
                               String version, Callback<Void> callback) throws VException {
        setPermissions(context, name, permissions, version, null, callback);
    }

    @Override
    public void setPermissions(VContext context, String name, Permissions permissions, String
            version, Options options, Callback<Void> callback) throws VException {
        nativeSetPermissionsAsync(nativePtr, context, name, permissions, version, options,
                callback);
    }

    @Override
    public Map<String, Permissions> getPermissions(VContext context, String name)
            throws VException {
        return getPermissions(context, name, (Options) null);
    }

    @Override
    public Map<String, Permissions> getPermissions(VContext context, String name, Options options)
            throws VException {
        return nativeGetPermissions(nativePtr, context, name, options);
    }

    @Override
    public void getPermissions(VContext context, String name, Callback<Map<String, Permissions>>
            callback) throws VException {
        getPermissions(context, name, null, callback);
    }

    @Override
    public void getPermissions(VContext context, String name, Options options,
                               Callback<Map<String, Permissions>> callback)
            throws VException {
        nativeGetPermissionsAsync(nativePtr, context, name, options, callback);
    }

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

    @Override
    public int hashCode() {
        return Long.valueOf(this.nativePtr).hashCode();
    }

    @Override
    protected void finalize() {
        nativeFinalize(this.nativePtr);
    }
}
