//Copyright 2017 Huawei Technologies Co., Ltd
//
//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 proto

import (
	"github.com/coreos/etcd/mvcc/mvccpb"
	"github.com/gorilla/websocket"
	"golang.org/x/net/context"
	"strings"
)

type EventType string

const (
	EVT_CREATE EventType = "CREATE"
	EVT_UPDATE EventType = "UPDATE"
	EVT_DELETE EventType = "DELETE"
	EVT_ERROR  EventType = "ERROR"
	MS_UP      string    = "UP"
	MS_DOWN    string    = "DOWN"

	MSI_UP           string = "UP"
	MSI_DOWN         string = "DOWN"
	MSI_STARTING     string = "STARTING"
	MSI_OUTOFSERVICE string = "OUTOFSERVICE"

	CHECK_BY_HEARTBEAT string = "push"
	CHECK_BY_PLATFORM  string = "pull"

	EXISTENCE_MS     string = "microservice"
	EXISTENCE_SCHEMA string = "schema"

	PROP_ALLOW_CROSS_APP = "allowCrossApp"
)

type SerivceInstanceCtrlServerEx interface {
	ServiceInstanceCtrlServer

	WebSocketWatch(ctx context.Context, in *WatchInstanceRequest, conn *websocket.Conn)
	WebSocketListAndWatch(ctx context.Context, in *WatchInstanceRequest, conn *websocket.Conn)
	CluterHealth(ctx context.Context) (*GetInstancesResponse, error)
}

type GovernServiceCtrlServerEx interface {
	GovernServiceCtrlServer
}

type MicroServiceDependency struct {
	Dependency []*MicroServiceKey
}

func CreateResponse(code Response_Code, message string) *Response {
	resp := &Response{
		Code:    code,
		Message: message,
	}
	return resp
}

func KvToResponse(kv *mvccpb.KeyValue) (keys []string, data []byte) {
	keys = strings.Split(string(kv.Key), "/")
	data = kv.Value
	return
}

func GetInfoFromInstKV(kv *mvccpb.KeyValue) (serviceId, instanceId, tenantProject string, data []byte) {
	keys, data := KvToResponse(kv)
	if len(keys) < 7 {
		return
	}
	serviceId = keys[len(keys)-2]
	instanceId = keys[len(keys)-1]
	tenantProject = strings.Join([]string{keys[len(keys)-4], keys[len(keys)-3]}, "/")
	return
}

func GetInfoFromTenantKV(kv *mvccpb.KeyValue) (tenant string) {
	keys, _ := KvToResponse(kv)
	if len(keys) < 3 {
		return
	}
	tenant = keys[len(keys)-1]
	return
}

func TransferToMicroServiceKeys(in []*DependencyMircroService, tenant string) []*MicroServiceKey {
	rst := []*MicroServiceKey{}
	for _, value := range in {
		rst = append(rst, &MicroServiceKey{
			Tenant:      tenant,
			AppId:       value.AppId,
			ServiceName: value.ServiceName,
			Version:     value.Version,
		})
	}
	return rst
}

func ToMicroServiceKey(tenant string, in *MicroService) *MicroServiceKey {
	return &MicroServiceKey{
		Tenant:      tenant,
		AppId:       in.AppId,
		ServiceName: in.ServiceName,
		Version:     in.Version,
	}
}
