package main

import (
	"context"
	"flag"
	"strconv"
	"strings"

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

	"code.hackerspace.pl/hscloud/bgpwtf/cccampix/irr/provider"
	pb "code.hackerspace.pl/hscloud/bgpwtf/cccampix/proto"
	"code.hackerspace.pl/hscloud/go/mirko"
)

type service struct {
	iana      *provider.IANA
	providers map[provider.IRR]provider.Provider
}

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

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

	s := &service{
		iana: provider.NewIANA(2),
		providers: map[provider.IRR]provider.Provider{
			provider.IRR_RIPE: provider.NewRIPE(10),
			provider.IRR_ARIN: provider.NewARIN(2),
		},
	}
	pb.RegisterIRRServer(mi.GRPC(), s)

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

	<-mi.Done()
}

// Query returns parsed RPSL data for a given aut-num objects in any of the
// supported IRRs.
func (s *service) Query(ctx context.Context, req *pb.IRRQueryRequest) (*pb.IRRQueryResponse, error) {
	if req.As == "" {
		return nil, status.Error(codes.InvalidArgument, "as must be given")
	}

	req.As = strings.ToLower(req.As)
	if strings.HasPrefix(req.As, "as") {
		req.As = req.As[2:]
	}

	asn, err := strconv.ParseUint(req.As, 10, 64)
	if err != nil {
		return nil, status.Error(codes.InvalidArgument, "as is invalid")
	}

	irr, err := s.iana.Who(ctx, asn)
	if err != nil {
		return nil, status.Errorf(codes.Unavailable, "could not find AS block delegation from IANA: %v", err)
	}

	prov, ok := s.providers[irr]
	if !ok {
		return nil, status.Errorf(codes.Unimplemented, "AS belongs to unhandled IRR %s", irr.String())
	}

	res, err := prov.Query(ctx, asn)
	return res, err
}
