package main

import (
	"context"
	"flag"

	"github.com/golang/glog"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	"code.hackerspace.pl/hscloud/bgpwtf/cccampix/peeringdb/schema"
	pb "code.hackerspace.pl/hscloud/bgpwtf/cccampix/proto"
	"code.hackerspace.pl/hscloud/go/mirko"
)

type service struct {
}

func (s *service) GetIXMembers(ctx context.Context, req *pb.GetIXMembersRequest) (*pb.GetIXMembersResponse, error) {
	if req.Id == 0 {
		return nil, status.Error(codes.InvalidArgument, "IX id must be given")
	}

	// First, get netixlans (membership info) for the given IX.
	js := struct {
		Data []schema.NetIXLan `json:"Data"`
	}{}
	err := schema.Get(ctx, &js, schema.NetIXLanInIXURL(req.Id))
	if err != nil {
		return nil, status.Errorf(codes.Unavailable, "PeeringDB query error: %v", err)
	}

	// Build set of seen Nets/ASs.
	netids := make(map[int64]bool)
	for _, netixlan := range js.Data {
		netids[netixlan.NetID] = true
	}

	// Convert set to unique list.
	nets := make([]int64, len(netids))
	i := 0
	for id, _ := range netids {
		nets[i] = id
		i += 1
	}

	// Request information about nets/ASNs:
	js2 := struct {
		Data []schema.Net `json:"Data"`
	}{}
	err = schema.Get(ctx, &js2, schema.NetURLMulti(nets))
	if err != nil {
		return nil, status.Errorf(codes.Unavailable, "PeeringDB query error: %v", err)
	}

	// Make map net id -> Net
	netidsNet := make(map[int64]*schema.Net)
	for _, net := range js2.Data {
		net := net
		netidsNet[net.ID] = &net
	}

	// Build joined response.

	res := &pb.GetIXMembersResponse{
		Members: make([]*pb.GetIXMembersResponse_Member, len(js.Data)),
	}

	for i, netixlan := range js.Data {
		res.Members[i] = &pb.GetIXMembersResponse_Member{
			Asn:  netixlan.ASN,
			Ipv4: netixlan.IPv4,
			Ipv6: netixlan.IPv6,
			Name: netidsNet[netixlan.NetID].Name,
		}
	}

	return res, nil
}

func main() {
	flag.Parse()
	mi := mirko.New()

	if err := mi.Listen(); err != nil {
		glog.Exitf("Listen failed: %v", err)
	}

	s := &service{}
	pb.RegisterPeeringDBProxyServer(mi.GRPC(), s)

	if err := mi.Serve(); err != nil {
		glog.Exitf("Serve failed: %v", err)
	}

	<-mi.Done()
}
