/*
 * 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 com.ceresdb;

import com.ceresdb.common.OptKeys;
import com.ceresdb.common.util.SystemPropertyUtil;
import com.ceresdb.proto.Storage;
import com.ceresdb.rpc.MethodDescriptor;
import com.ceresdb.rpc.RpcFactoryProvider;

/**
 *
 * @author jiachun.fjc
 */
public class RpcServiceRegister {

    private static final double WRITE_LIMIT_PERCENT     = writeLimitPercent();

    private static final String STORAGE_METHOD_TEMPLATE = "storage.StorageService/%s";

    public static void registerStorageService() {
        // register protobuf serializer
        RpcFactoryProvider.getRpcFactory().register(
            MethodDescriptor.of(String.format(STORAGE_METHOD_TEMPLATE, "Route"), MethodDescriptor.MethodType.UNARY), //
            Storage.RouteRequest.class, //
            Storage.RouteRequest.getDefaultInstance(), //
            Storage.RouteResponse.getDefaultInstance());
        RpcFactoryProvider.getRpcFactory().register(
            MethodDescriptor.of(String.format(STORAGE_METHOD_TEMPLATE, "Write"), MethodDescriptor.MethodType.UNARY,
                WRITE_LIMIT_PERCENT), //
            Storage.WriteRequest.class, //
            Storage.WriteRequest.getDefaultInstance(), //
            Storage.WriteResponse.getDefaultInstance());
        RpcFactoryProvider.getRpcFactory().register(
            MethodDescriptor.of(String.format(STORAGE_METHOD_TEMPLATE, "StreamWrite"),
                MethodDescriptor.MethodType.CLIENT_STREAMING), //
            Storage.WriteRequest.class, //
            Storage.WriteRequest.getDefaultInstance(), //
            Storage.WriteResponse.getDefaultInstance());
        RpcFactoryProvider.getRpcFactory().register(
            MethodDescriptor.of(String.format(STORAGE_METHOD_TEMPLATE, "Query"), MethodDescriptor.MethodType.UNARY,
                1 - WRITE_LIMIT_PERCENT), //
            Storage.QueryRequest.class, //
            Storage.QueryRequest.getDefaultInstance(), //
            Storage.QueryResponse.getDefaultInstance());
        RpcFactoryProvider.getRpcFactory().register(
            MethodDescriptor.of(String.format(STORAGE_METHOD_TEMPLATE, "StreamQuery"),
                MethodDescriptor.MethodType.SERVER_STREAMING), //
            Storage.QueryRequest.class, //
            Storage.QueryRequest.getDefaultInstance(), //
            Storage.QueryResponse.getDefaultInstance());
    }

    private static double writeLimitPercent() {
        try {
            return Math.min(1.0, Double.parseDouble(SystemPropertyUtil.get(OptKeys.WRITE_LIMIT_PERCENT, "0.7")));
        } catch (final Throwable ignored) {
            return 0.7;
        }
    }
}
