// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package lib

import (
	"encoding/base64"
	"encoding/xml"
	"fmt"
	"net/url"

	"fuchsia.googlesource.com/fuchsia/tools/whereiscl/netutil"
)

const fuchsiaURL = "https://fuchsia.googlesource.com"

// GIStatus represents the status of a CL in Global Integration.
type GIStatus string

const (
	giStatusUnknown GIStatus = "UNKNOWN"
	giStatusPassed           = "PASSED"
	giStatusPending          = "PENDING"
)

func downloadGIManifest(name string) ([]byte, error) {
	u, err := url.Parse(fuchsiaURL)
	if err != nil {
		return nil, err
	}
	u.Path = "/integration/+/refs/heads/master/" + name
	q := u.Query()
	q.Set("format", "TEXT")
	u.RawQuery = q.Encode()

	b, err := netutil.HTTPGet(u.String())
	if err != nil {
		return nil, err
	}
	return base64.StdEncoding.DecodeString(string(b))
}

// Structs for unmarshalling the jiri manifest XML data.
type manifest struct {
	XMLName  xml.Name  `xml:"manifest"`
	Projects []project `xml:"projects>project"`
}
type project struct {
	XMLName  xml.Name `xml:"project"`
	Name     string   `xml:"name,attr"`
	Revision string   `xml:"revision,attr"`
}

func getGIRevision(content []byte, project string) (string, error) {
	m := manifest{}
	if err := xml.Unmarshal(content, &m); err != nil {
		return "", err
	}

	for _, p := range m.Projects {
		if p.Name == project {
			return p.Revision, nil
		}
	}

	return "", fmt.Errorf("project %q is not found in the jiri manifest", project)
}

type gitLogs struct {
	Log []gitLog `json:"log"`
}

type gitLog struct {
	Commit string `json:"commit"`
}

func isAfterGI(project, clRevision, giRevision string) (bool, error) {
	u, err := url.Parse(fuchsiaURL)
	if err != nil {
		return false, err
	}
	u.Path = fmt.Sprintf("/%s/+log/%s..HEAD", project, giRevision)
	q := u.Query()
	q.Set("format", "JSON")
	u.RawQuery = q.Encode()

	logs := gitLogs{}
	if err := netutil.HTTPGetJSON(u.String(), &logs); err != nil {
		return false, err
	}
	for _, log := range logs.Log {
		if log.Commit == clRevision {
			return true, nil
		}
	}
	return false, nil
}

// GetGIStatus returns whether a given ChangeInfo passed Global Integration.
func GetGIStatus(ci *ChangeInfo) (GIStatus, error) {
	var name string

	switch ci.Project {
	case "fuchsia":
		name = "stem"
	case "topaz":
		name = "topaz/minimal"
	case "experiences":
		name = "flower"
	default:
		return giStatusUnknown, nil
	}

	manifest, err := downloadGIManifest(name)
	if err != nil {
		return giStatusUnknown, err
	}

	rev, err := getGIRevision(manifest, ci.Project)
	if err != nil {
		return giStatusUnknown, err
	}

	after, err := isAfterGI(ci.Project, ci.CurrentRevision, rev)
	if err != nil {
		return giStatusUnknown, err
	}
	if after {
		return giStatusPending, nil
	}
	return giStatusPassed, nil
}
