/*
 *     Copyright 2016-2026 TinyZ
 *
 * Licensed 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 okra.demo.common.util;

import com.google.protobuf.Descriptors;
import com.google.protobuf.Descriptors.FieldDescriptor;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import org.ogcs.okra.example.game.generated.Gpb;

import java.util.Map;

/**
 * Google Protocol Buffers反射为Java数组
 * @author TinyZ
 * @date 2017-01-15.
 */
public class Gpb4JUtil {


    public Object[] covertGpb2ObjArray(Message message) {
        Map<FieldDescriptor, Object> fields = message.getAllFields();
        Object[] objects = new Object[fields.size()];
        for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) {
            FieldDescriptor fieldDescriptor = entry.getKey();
            String name = fieldDescriptor.getName();



        }
        return objects;
    }

    public static void main(String[] args) throws InvalidProtocolBufferException {
        Descriptors.FileDescriptor descriptor = Gpb.getDescriptor();

        Gpb.Request build = Gpb.Request.newBuilder()
                .setId(1)
                .setApi(1001)
                .build();
        Gpb.Response response = Gpb.Response.newBuilder()
                .setId(1)
                .setData(build.toByteString())
                .setError(
                        Gpb.Error.newBuilder()
                                .setMsg("SomeThing")
                                .setRet(1)
                                .build()
                )
                .build();

        //  收到的数据
//        Message parseFrom = Gpb.Request.parseFrom(build.toByteArray());
        Message parseFrom = Gpb.Response.parseFrom(response.toByteArray());

        Map<FieldDescriptor, Object> fields = parseFrom.getAllFields();
        Object[] objects = parseFrom.getAllFields().values().toArray();

        Object[] params = new Object[parseFrom.getAllFields().size()];


        for (Map.Entry<FieldDescriptor, Object> entry : fields.entrySet()) {
            Object covert = covert(entry.getKey(), entry.getValue());
            params[entry.getKey().getIndex()] = entry.getValue();
            System.out.println();
        }


        System.out.println();
    }

    private static Object covert(FieldDescriptor fieldDescriptor, Object obj) {
        FieldDescriptor.JavaType javaType = fieldDescriptor.getJavaType();
        switch (javaType) {
            case INT:
                break;
            case LONG:
                break;
            case FLOAT:
                break;
            case DOUBLE:
                break;
            case BOOLEAN:
                break;
            case STRING:
                break;
            case BYTE_STRING:
                break;
            case ENUM:
                break;
            case MESSAGE:
                break;
        }
        return null;
    }













}