//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 rest

import (
	"net/http"

	"github.com/ServiceComb/service-center/util"

	pb "github.com/ServiceComb/service-center/server/core/proto"
	"github.com/ServiceComb/service-center/util/rest"
	"strings"
)

//Node 节点信息
type Node struct {
	Id       string   `json:"id";`
	Name     string   `json:"name"`
	AppID    string   `json:"appId"`
	Version  string   `json:"version"`
	Type     string   `json:"type"`
	Color    string   `json:"color"`
	Position string   `json:"position"`
	Visits   []string `json:"-"`
}

//Line 连接线信息
type Line struct {
	From        Node   `json:"from"`
	To          Node   `json:"to"`
	Type        string `json:"type"`
	Color       string `json:"color"`
	Description string `json:"descriptor"`
}

//Circle 环信息
type Circle struct {
	Nodes []Node `json:"nodes"`
}

//Graph 图全集信息
type Graph struct {
	Nodes   []Node   `json:"nodes"`
	Lines   []Line   `json:"lines"`
	Circles []Circle `json:"circles"`
	Visits  []string `json:"-"`
}

// GetGraph 获取依赖连接图详细依赖关系
func (governService *GovernService) GetGraph(w http.ResponseWriter, r *http.Request) {
	var graph Graph
	request := &pb.GetServicesRequest{}
	ctx := r.Context()
	resp, err := ServiceAPI.GetServices(ctx, request)
	if err != nil {
		WriteText(http.StatusInternalServerError, err.Error(), w)
		return
	}
	services := resp.GetServices()
	if len(services) <= 0 {
		return
	}
	nodes := make([]Node, len(services))
	for index, service := range services {
		nodes[index].Name = service.ServiceName
		nodes[index].Id = service.ServiceId
		nodes[index].AppID = service.AppId
		nodes[index].Version = service.Version

		proRequest := &pb.GetDependenciesRequest{
			ServiceId: service.ServiceId,
		}
		proResp, err := ServiceAPI.GetConsumerDependencies(ctx, proRequest)
		if err != nil {
			util.LOGGER.Error("get Dependency failed.", err)
			WriteText(http.StatusInternalServerError, "get Dependency failed", w)
			return
		}

		providers := proResp.Providers
		countInner := len(providers)
		if countInner <= 0 {
			continue
		}
		for _, child := range providers {
			if child == nil {
				continue
			}

			if service.ServiceId == child.ServiceId {
				continue
			}
			line := Line{}
			line.From = nodes[index]
			line.To.Name = child.ServiceName
			line.To.Id = child.ServiceId
			graph.Lines = append(graph.Lines, line)
		}
	}
	graph.Nodes = nodes
	WriteJsonObject(http.StatusOK, graph, w)
}

// GovernService 治理相关接口服务
type GovernService struct {
	//
}

// URLPatterns 路由
func (governService *GovernService) URLPatterns() []rest.Route {
	return []rest.Route{
		{rest.HTTP_METHOD_GET, "/registry/v3/govern/service/:serviceId", governService.GetServiceDetail},
		{rest.HTTP_METHOD_GET, "/registry/v3/govern/relation", governService.GetGraph},
		{rest.HTTP_METHOD_GET, "/registry/v3/govern/services", governService.GetAllServicesInfo},
	}
}

// GetServiceDetail 查询服务详细信息
func (governService *GovernService) GetServiceDetail(w http.ResponseWriter, r *http.Request) {
	serviceID := r.URL.Query().Get(":serviceId")
	request := &pb.GetServiceRequest{
		ServiceId: serviceID,
	}
	ctx := r.Context()
	resp, err := GovernServiceAPI.GetServiceDetail(ctx, request)

	respInternal := resp.Response
	resp.Response = nil
	WriteJsonResponse(respInternal, resp, err, w)
}

func (governService *GovernService) GetAllServicesInfo(w http.ResponseWriter, r *http.Request) {
	request := &pb.GetServicesInfoRequest{}
	ctx := r.Context()
	optsStr := r.URL.Query().Get("options")
	request.Options = strings.Split(optsStr, ",")
	resp, err := GovernServiceAPI.GetServicesInfo(ctx, request)

	respInternal := resp.Response
	resp.Response = nil
	WriteJsonResponse(respInternal, resp, err, w)
}
