package main

import (
	"bytes"
	"flag"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"time"
)

func main() {
	addPtr := flag.String("add", "", "Instance to add")
	followPtr := flag.String("follow", "", "Follow a target relay")
	statusPtr := flag.Bool("status", false, "Get server status")
	flag.Parse()

	/* Condition verification */
	totalflags := 0
	var cmdType string
	var requestJson string
	if *statusPtr != false {
		totalflags++
		cmdType = "status"
	}
	if *followPtr != "" {
		totalflags++
		cmdType = "follow"
		requestJson = fmt.Sprintf(`{"follow": "%s"}`, *followPtr)
	}
	if *addPtr != "" {
		totalflags++
		cmdType = "add"
		requestJson = fmt.Sprintf(`{"host": "%s"}`, *addPtr)
	}

	if totalflags > 1 {
		fmt.Println("Incompatible arguments, exiting.")
		os.Exit(1)
	} else if totalflags == 0 {
		fmt.Println("No options specified, exiting.")
		os.Exit(1)
	}

	requestBytes := []byte(requestJson)
	payload := bytes.NewReader(requestBytes)

	req, err := http.NewRequest("POST", "http://127.0.0.1:5555/"+cmdType, payload)
	if err != nil {
		log.Fatal("Error condition")
	}

	client := &http.Client{Timeout: 10 * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}

	switch cmdType {
	case "add":
		fmt.Println("Add")
	case "status":
		defer resp.Body.Close()
		bodyBytes, _ := io.ReadAll(resp.Body)
		fmt.Println(string(bodyBytes))
	case "follow":
		defer resp.Body.Close()
		bodyBytes, _ := io.ReadAll(resp.Body)
		fmt.Println(string(bodyBytes))
	}
}