package crypto

import (
	"bufio"
	"crypto/rsa"
	"crypto/x509"
	"encoding/base64"
	"fmt"
	"os"
	"strings"

	"github.com/Queueue0/qpass/internal/dbman"
)

func getKnownHosts() (map[string]*rsa.PublicKey, error) {
	home, err := dbman.GetQpassHome()
	if err != nil {
		return nil, err
	}

	fName := home + "/known_hosts"
	hostsFile, err := os.OpenFile(fName, os.O_RDONLY|os.O_CREATE, 0600)
	if err != nil {
		return nil, err
	}

	defer hostsFile.Close()

	hosts := make(map[string]*rsa.PublicKey)

	scanner := bufio.NewScanner(hostsFile)
	for scanner.Scan() {
		host, keyString, ok := strings.Cut(scanner.Text(), " ")
		if !ok {
			// Something went wrong, skip current line
			continue
		}

		keyBytes, err := base64.RawStdEncoding.DecodeString(keyString)
		if err != nil {
			return nil, err
		}

		key, err := x509.ParsePKCS1PublicKey(keyBytes)
		if err != nil {
			return nil, err
		}

		hosts[host] = key
	}

	return hosts, nil
}

func addHost(addr string, key *rsa.PublicKey) error {
	home, err := dbman.GetQpassHome()
	if err != nil {
		return err
	}

	fName := home + "/known_hosts"
	f, err := os.OpenFile(fName, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0600)
	if err != nil {
		return err
	}

	defer f.Close()

	keyBytes := x509.MarshalPKCS1PublicKey(key)
	keyString := base64.RawStdEncoding.EncodeToString(keyBytes)

	f.WriteString(fmt.Sprintf("%s %s\n", addr, keyString))

	return nil
}