package main

import (
	"crypto/tls"
	"fmt"
	"time"

	"github.com/cloudflare/cfssl/csr"
	"github.com/cloudflare/cfssl/signer"
	"github.com/golang/glog"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
)

func (p *prodvider) selfCreds() grpc.ServerOption {
	glog.Infof("Bootstrapping certificate for self (%q)...", flagProdviderCN)

	// Create a key and CSR.
	csrPEM, keyPEM, err := p.makeSelfCSR()
	if err != nil {
		glog.Exitf("Could not generate key and CSR for self: %v", err)
	}

	// Create a cert
	certPEM, err := p.makeSelfCertificate(csrPEM)
	if err != nil {
		glog.Exitf("Could not sign certificate for self: %v", err)
	}

	serverCert, err := tls.X509KeyPair(certPEM, keyPEM)
	if err != nil {
		glog.Exitf("Could not use gRPC certificate: %v", err)
	}

	signerCert, _ := p.sign.Certificate("", "")
	serverCert.Certificate = append(serverCert.Certificate, signerCert.Raw)

	return grpc.Creds(credentials.NewTLS(&tls.Config{
		Certificates: []tls.Certificate{serverCert},
	}))
}

func (p *prodvider) makeSelfCSR() ([]byte, []byte, error) {
	signerCert, _ := p.sign.Certificate("", "")
	req := &csr.CertificateRequest{
		CN: flagProdviderCN,
		KeyRequest: &csr.BasicKeyRequest{
			A: "rsa",
			S: 4096,
		},
		Names: []csr.Name{
			{
				C:  signerCert.Subject.Country[0],
				ST: signerCert.Subject.Province[0],
				L:  signerCert.Subject.Locality[0],
				O:  signerCert.Subject.Organization[0],
				OU: signerCert.Subject.OrganizationalUnit[0],
			},
		},
	}

	g := &csr.Generator{
		Validator: func(req *csr.CertificateRequest) error { return nil },
	}

	return g.ProcessRequest(req)
}

func (p *prodvider) makeSelfCertificate(csr []byte) ([]byte, error) {
	req := signer.SignRequest{
		Hosts:   []string{},
		Request: string(csr),
		Profile: "server",
	}
	return p.sign.Sign(req)
}

func (p *prodvider) makeKubernetesCSR(username, o string) ([]byte, []byte, error) {
	signerCert, _ := p.sign.Certificate("", "")
	req := &csr.CertificateRequest{
		CN: username,
		KeyRequest: &csr.BasicKeyRequest{
			A: "rsa",
			S: 4096,
		},
		Names: []csr.Name{
			{
				C:  signerCert.Subject.Country[0],
				ST: signerCert.Subject.Province[0],
				L:  signerCert.Subject.Locality[0],
				O:  o,
				OU: fmt.Sprintf("Prodvider Kubernetes Cert for %s/%s", username, o),
			},
		},
	}

	g := &csr.Generator{
		Validator: func(req *csr.CertificateRequest) error { return nil },
	}

	return g.ProcessRequest(req)
}

func (p *prodvider) makeKubernetesCertificate(csr []byte, notAfter time.Time) ([]byte, error) {
	req := signer.SignRequest{
		Hosts:    []string{},
		Request:  string(csr),
		Profile:  "client",
		NotAfter: notAfter,
	}
	return p.sign.Sign(req)
}
