// Copyright 2024 WIT.COM Inc Licensed GPL 3.0

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"

	"go.wit.com/lib/protobuf/forgepb"
	"go.wit.com/log"
)

func sendPatches(pset *forgepb.Patchset) error {
	var url string
	url = me.urlbase + "/patchset"
	msg, err := pset.Marshal()
	if err != nil {
		log.Info("proto.Marshal() failed:", err)
		return err
	}
	log.Info("proto.Marshal() msg len", len(msg))
	body, err := httpPost(url, msg)
	if err != nil {
		log.Info("httpPost() failed:", err)
		return err
	}

	test := strings.TrimSpace(string(body))
	// log.Info("virtigo returned body:", test)
	for _, line := range strings.Split(test, "\n") {
		log.Info("got back:", line)
	}
	return nil
}

func listPatches() error {
	var url string
	url = me.urlbase + "/patchsetlist"
	body, err := httpPost(url, nil)
	if err != nil {
		log.Info("httpPost() failed:", err)
		return err
	}

	var last string
	test := strings.TrimSpace(string(body))
	for _, line := range strings.Split(test, "\n") {
		log.Info("patchset:", line)
		last = strings.TrimSpace(line)
	}
	parts := strings.Fields(last)
	if len(parts) == 0 {
		return fmt.Errorf("listPatches() there are no patchsets at this time")
	}
	getPatch(parts[0])
	return nil
}

func lastPatch() string {
	var url string
	url = me.urlbase + "/patchsetlist"
	body, err := httpPost(url, nil)
	if err != nil {
		log.Info("httpPost() failed:", err)
		return ""
	}

	var last string
	test := strings.TrimSpace(string(body))
	for _, line := range strings.Split(test, "\n") {
		log.Info("patchset:", line)
		last = strings.TrimSpace(line)
	}
	parts := strings.Fields(last)
	return parts[0]
}

func doRegister(newurl string) error {
	var url string
	url = me.urlbase + "/register?url=" + newurl
	body, err := httpPost(url, nil)
	if err != nil {
		log.Info("httpPost() failed:", err)
		return err
	}

	test := strings.TrimSpace(string(body))
	for _, line := range strings.Split(test, "\n") {
		line = strings.TrimSpace(line)
		log.Info("server returned:", line)
	}
	return nil
}

func getPatch(pbfile string) (*forgepb.Patchset, error) {
	url := me.urlbase + "/patchsetget?filename=" + pbfile
	log.Info("getPatch() url", url)
	body, err := httpPost(url, nil)
	if err != nil {
		log.Info("httpPost() failed:", err)
		return nil, err
	}
	log.Info("getPatch() len(body)", len(body))
	var pset *forgepb.Patchset
	pset = new(forgepb.Patchset)
	err = pset.Unmarshal(body)
	if err != nil {
		log.Info("Unmarshal failed", err)
		return nil, err
	}
	filename := filepath.Join("/tmp", pbfile)
	f, _ := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
	f.Write(body)
	f.Close()
	return pset, nil
}

func sendDevelDiff(name string) error {
	pset, err := me.forge.MakeDevelPatchSet()
	if err != nil {
		return err
	}
	pset.Name = name
	if os.Getenv("GIT_AUTHOR_NAME") == "" {
		return fmt.Errorf("GIT_AUTHOR_NAME not set")
	} else {
		pset.GitAuthorName = os.Getenv("GIT_AUTHOR_NAME")
	}
	if os.Getenv("GIT_AUTHOR_EMAIL") == "" {
		return fmt.Errorf("GIT_AUTHOR_EMAIL not set")
	} else {
		pset.GitAuthorEmail = os.Getenv("GIT_AUTHOR_EMAIL")
	}

	if err := sendPatches(pset); err != nil {
		return err
	}
	return nil
}

func sendMasterDiff() {
	pset, err := me.forge.MakeMasterPatchSet()
	if err != nil {
		badExit(err)
	}
	all := pset.Patches.SortByFilename()
	for all.Scan() {
		p := all.Next()
		log.Info("read in patch:", p.Filename)
	}
	err = me.forge.SendPatchSet(pset)
	if err != nil {
		badExit(err)
	}
}