/*
 * 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.ignite.internal.processors.cache;

import java.io.Serializable;
import java.util.Map;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.lang.IgniteUuid;

/**
 * Discovery data sent from client reconnecting to cluster.
 */
public class CacheClientReconnectDiscoveryData implements Serializable {
    /** */
    private static final long serialVersionUID = 0L;

    /** */
    private final Map<Integer, CacheGroupInfo> clientCacheGrps;

    /** */
    private final Map<String, CacheInfo> clientCaches;

    /**
     * @param clientCaches Information about caches started on re-joining client node.
     * @param clientCacheGrps Information about cach groups started on re-joining client node.
     */
    CacheClientReconnectDiscoveryData(Map<Integer, CacheGroupInfo> clientCacheGrps,
        Map<String, CacheInfo> clientCaches) {
        this.clientCacheGrps = clientCacheGrps;
        this.clientCaches = clientCaches;
    }

    /**
     * @return Information about caches started on re-joining client node.
     */
    Map<Integer, CacheGroupInfo> clientCacheGroups() {
        return clientCacheGrps;
    }

    /**
     * @return Information about caches started on re-joining client node.
     */
    public Map<String, CacheInfo> clientCaches() {
        return clientCaches;
    }

    /**
     *
     */
    static class CacheGroupInfo implements Serializable {
        /** */
        private static final long serialVersionUID = 0L;

        /** */
        private final CacheConfiguration ccfg;

        /** */
        private final IgniteUuid deploymentId;

        /** Flags added for future usage. */
        private final long flags;

        /**
         * @param ccfg Cache group configuration.
         * @param deploymentId Cache group deployment ID.
         * @param flags Flags (for future usage).
         */
        CacheGroupInfo(CacheConfiguration ccfg,
            IgniteUuid deploymentId,
            long flags) {
            assert ccfg != null;
            assert deploymentId != null;

            this.ccfg = ccfg;
            this.deploymentId = deploymentId;
            this.flags = flags;
        }

        /**
         * @return Cache group configuration.
         */
        CacheConfiguration config() {
            return ccfg;
        }

        /**
         * @return Cache group deployment ID.
         */
        IgniteUuid deploymentId() {
            return deploymentId;
        }
    }

    /**
     *
     */
    static class CacheInfo implements Serializable {
        /** */
        private static final long serialVersionUID = 0L;

        /** */
        private final CacheConfiguration ccfg;

        /** */
        private final CacheType cacheType;

        /** */
        private final IgniteUuid deploymentId;

        /** */
        private final boolean nearCache;

        /** Flags added for future usage. */
        private final long flags;

        /**
         * @param ccfg Cache configuration.
         * @param cacheType Cache type.
         * @param deploymentId Cache deployment ID.
         * @param nearCache Near cache flag.
         * @param flags Flags (for future usage).
         */
        CacheInfo(CacheConfiguration ccfg,
            CacheType cacheType,
            IgniteUuid deploymentId,
            boolean nearCache,
            long flags) {
            assert ccfg != null;
            assert cacheType != null;
            assert deploymentId != null;

            this.ccfg = ccfg;
            this.cacheType = cacheType;
            this.deploymentId = deploymentId;
            this.nearCache = nearCache;
            this.flags = flags;
        }

        /**
         * @return Cache configuration.
         */
        CacheConfiguration config() {
            return ccfg;
        }

        /**
         * @return Cache type.
         */
        CacheType cacheType() {
            return cacheType;
        }

        /**
         * @return Cache deployment ID.
         */
        IgniteUuid deploymentId() {
            return deploymentId;
        }

        /**
         * @return Near cache flag.
         */
        boolean nearCache() {
            return nearCache;
        }

        /** {@inheritDoc} */
        @Override public String toString() {
            return S.toString(CacheInfo.class, this);
        }
    }

    /** {@inheritDoc} */
    @Override public String toString() {
        return S.toString(CacheClientReconnectDiscoveryData.class, this);
    }
}
