package main

import (
	"context"
	"flag"

	"code.hackerspace.pl/hscloud/go/mirko"
	"github.com/golang/glog"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	pb "code.hackerspace.pl/hscloud/dc/cmc-proxy/proto"
)

var (
	flagCMCAddress  string
	flagCMCUsername string
	flagCMCPassword string
)

const (
	pathLogin    = "cgi-bin/webcgi/login"
	pathLogout   = "cgi-bin/webcgi/logout"
	pathiDRACURL = "cgi-bin/webcgi/blade_iDRAC_url"
)

func init() {
	flag.Set("logtostderr", "true")
}

type service struct {
	cmc *cmcClient
}

func (s *service) GetKVMData(ctx context.Context, req *pb.GetKVMDataRequest) (*pb.GetKVMDataResponse, error) {
	if req.BladeNum < 1 || req.BladeNum > 16 {
		return nil, status.Error(codes.InvalidArgument, "blade_num must be [1,16]")
	}

	details, err := s.cmc.RequestKVMDetails(ctx, int(req.BladeNum))
	if err != nil {
		glog.Errorf("RequestKVMDetails(_, %d): %v", req.BladeNum, err)
		return nil, status.Error(codes.Unavailable, "CMC unavailable")
	}

	return &pb.GetKVMDataResponse{
		Arguments: details.arguments,
	}, nil
}

func main() {
	flag.StringVar(&flagCMCAddress, "cmc_address", "https://10.10.10.10", "URL of Dell M1000e CMC")
	flag.StringVar(&flagCMCUsername, "cmc_username", "root", "Login username for CMC")
	flag.StringVar(&flagCMCPassword, "cmc_password", "", "Login password for CMC")
	flag.Parse()

	m := mirko.New()
	if err := m.Listen(); err != nil {
		glog.Exitf("Could not listen: %v", err)
	}

	s := &service{
		cmc: NewCMCClient(),
	}
	pb.RegisterCMCProxyServer(m.GRPC(), s)

	if err := m.Serve(); err != nil {
		glog.Exitf("Could not run: %v", err)
	}

	go s.cmc.Run(m.Context())
	glog.Info("Running.")

	<-m.Done()
}
