// +build integration

/*
 * 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 integration

import (
	"context"
	"os"
	"testing"
	"time"
)

import (
	hessian "github.com/apache/dubbo-go-hessian2"
	"github.com/apache/dubbo-go/common"
	"github.com/apache/dubbo-go/config"
	_ "github.com/apache/dubbo-go/metadata/service/inmemory"
	"github.com/apache/dubbo-go/protocol"
	"github.com/apache/dubbo-go/remoting"

	gxlog "github.com/dubbogo/gost/log"
)

var userProvider = &UserProvider{
	ch: make(chan *User),
}

func TestMain(m *testing.M) {
	config.SetConsumerService(userProvider)
	hessian.RegisterPOJO(&User{})
	config.Load()
	time.Sleep(3 * time.Second)

	os.Exit(m.Run())
}

type User struct {
	ID   string
	Name string
	Age  int32
	Time time.Time
}

type UserProvider struct {
	GetUser func(ctx context.Context, req []interface{}, rsp *User) error
	ch      chan *User
}

func (u *UserProvider) Reference() string {
	return "UserProvider"
}

// to enable async call:
// 1. need to implement AsyncCallbackService
// 2. need to specify references -> UserProvider -> async in conf/client.yml
func (u *UserProvider) CallBack(res common.CallbackResponse) {
	gxlog.CInfo("CallBack res: %v", res)
	if r, ok := res.(remoting.AsyncCallbackResponse); ok {
		if reply, ok := r.Reply.(*remoting.Response); ok {
			if result, ok := reply.Result.(*protocol.RPCResult); ok {
				if user, ok := result.Rest.(*User); ok {
					u.ch <- user
				}
			}
		}
	}
	u.ch <- nil
}

func (User) JavaClassName() string {
	return "org.apache.dubbo.User"
}
