// Copyright 2015 The Vanadium 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 impl

import (
	"bytes"
	"errors"
	"os/exec"
	"runtime"
	"strings"

	"v.io/v23/services/build"
	"v.io/v23/services/device"
	"v.io/x/ref/services/profile"
)

// ComputeDeviceProfile generates a description of the runtime
// environment (supported file format, OS, architecture, libraries) of
// the host device.
//
// TODO(jsimsa): Avoid computing the host device description from
// scratch if a recent cached copy exists.
func ComputeDeviceProfile() (*profile.Specification, error) {
	result := profile.Specification{}

	// Find out what the supported operating system, file format, and
	// architecture is.
	var os build.OperatingSystem
	if err := os.SetFromGoOS(runtime.GOOS); err != nil {
		return nil, err
	}
	result.Os = os
	switch os {
	case build.OperatingSystemDarwin:
		result.Format = build.FormatMach
	case build.OperatingSystemLinux:
		result.Format = build.FormatElf
	case build.OperatingSystemWindows:
		result.Format = build.FormatPe
	default:
		return nil, errors.New("Unsupported operating system: " + os.String())
	}
	var arch build.Architecture
	if err := arch.SetFromGoArch(runtime.GOARCH); err != nil {
		return nil, err
	}
	result.Arch = arch

	// Find out what the installed dynamically linked libraries are.
	switch runtime.GOOS {
	case "linux":
		// For Linux, we identify what dynamically linked libraries are
		// installed by parsing the output of "ldconfig -p".
		command := exec.Command("/sbin/ldconfig", "-p")
		output, err := command.CombinedOutput()
		if err != nil {
			return nil, err
		}
		buf := bytes.NewBuffer(output)
		// Throw away the first line of output from ldconfig.
		if _, err := buf.ReadString('\n'); err != nil {
			return nil, errors.New("Could not identify libraries.")
		}
		// Extract the library name and version from every subsequent line.
		result.Libraries = make(map[profile.Library]struct{})
		line, err := buf.ReadString('\n')
		for err == nil {
			words := strings.Split(strings.Trim(line, " \t\n"), " ")
			if len(words) > 0 {
				tokens := strings.Split(words[0], ".so")
				if len(tokens) != 2 {
					return nil, errors.New("Could not identify library: " + words[0])
				}
				name := strings.TrimPrefix(tokens[0], "lib")
				major, minor := "", ""
				tokens = strings.SplitN(tokens[1], ".", 3)
				if len(tokens) >= 2 {
					major = tokens[1]
				}
				if len(tokens) >= 3 {
					minor = tokens[2]
				}
				result.Libraries[profile.Library{Name: name, MajorVersion: major, MinorVersion: minor}] = struct{}{}
			}
			line, err = buf.ReadString('\n')
		}
	case "darwin":
		// TODO(jsimsa): Implement.
	case "windows":
		// TODO(jsimsa): Implement.
	default:
		return nil, errors.New("Unsupported operating system: " + runtime.GOOS)
	}
	return &result, nil
}

// getProfile gets a profile description for the given profile.
//
// TODO(jsimsa): Avoid retrieving the list of known profiles from a
// remote server if a recent cached copy exists.
func getProfile(name string) (*profile.Specification, error) {
	profiles, err := getKnownProfiles()
	if err != nil {
		return nil, err
	}
	for _, p := range profiles {
		if p.Label == name {
			return p, nil
		}
	}
	return nil, nil

	// TODO(jsimsa): This function assumes the existence of a profile
	// server from which the profiles can be retrieved. The profile
	// server is a work in progress. When it exists, the commented out
	// code below should work.
	/*
		var profile profile.Specification
				client, err := r.NewClient()
				if err != nil {
					return nil, verror.New(ErrOperationFailed, nil, fmt.Sprintf("NewClient() failed: %v", err))
				}
				defer client.Close()
			  server := // TODO
				method := "Specification"
				inputs := make([]interface{}, 0)
				call, err := client.StartCall(server + "/" + name, method, inputs)
				if err != nil {
					return nil, verror.New(ErrOperationFailed, nil, fmt.Sprintf("StartCall(%s, %q, %v) failed: %v\n", server + "/" + name, method, inputs, err))
				}
				if err := call.Finish(&profiles); err != nil {
					return nil, verror.New(ErrOperationFailed, nil, fmt.Sprintf("Finish(%v) failed: %v\n", &profiles, err))
				}
		return &profile, nil
	*/
}

// getKnownProfiles gets a list of description for all publicly known
// profiles.
//
// TODO(jsimsa): Avoid retrieving the list of known profiles from a
// remote server if a recent cached copy exists.
func getKnownProfiles() ([]*profile.Specification, error) {
	return []*profile.Specification{
		{
			Label:       "linux-amd64",
			Description: "",
			Arch:        build.ArchitectureAmd64,
			Os:          build.OperatingSystemLinux,
			Format:      build.FormatElf,
		},
		{
			// Note that linux-386 is used instead of linux-x86 for the
			// label to facilitate generation of a matching label string
			// using the runtime.GOARCH value. In VDL, the 386 architecture
			// is represented using the value X86 because the VDL grammar
			// does not allow identifiers starting with a number.
			Label:       "linux-386",
			Description: "",
			Arch:        build.ArchitectureX86,
			Os:          build.OperatingSystemLinux,
			Format:      build.FormatElf,
		},
		{
			Label:       "linux-arm",
			Description: "",
			Arch:        build.ArchitectureArm,
			Os:          build.OperatingSystemLinux,
			Format:      build.FormatElf,
		},
		{
			Label:       "darwin-amd64",
			Description: "",
			Arch:        build.ArchitectureAmd64,
			Os:          build.OperatingSystemDarwin,
			Format:      build.FormatMach,
		},
	}, nil

	// TODO(jsimsa): This function assumes the existence of a profile
	// server from which a list of known profiles can be retrieved. The
	// profile server is a work in progress. When it exists, the
	// commented out code below should work.

	/*
		knownProfiles := make([]profile.Specification, 0)
				client, err := r.NewClient()
				if err != nil {
					return nil,  verror.New(ErrOperationFailed, nil, fmt.Sprintf("NewClient() failed: %v\n", err))
				}
				defer client.Close()
			  server := // TODO
				method := "List"
				inputs := make([]interface{}, 0)
				call, err := client.StartCall(server, method, inputs)
				if err != nil {
					return nil, verror.New(ErrOperationFailed, nil, fmt.Sprintf("StartCall(%s, %q, %v) failed: %v\n", server, method, inputs, err))
				}
				if err := call.Finish(&knownProfiles); err != nil {
					return nil, verror.New(ErrOperationFailed, nil, fmt.Sprintf("Finish(&knownProfile) failed: %v\n", err))
				}
		return knownProfiles, nil
	*/
}

// matchProfiles inputs a profile that describes the host device and a
// set of publicly known profiles and outputs a device description that
// identifies the publicly known profiles supported by the host device.
func matchProfiles(p *profile.Specification, known []*profile.Specification) device.Description {
	result := device.Description{Profiles: make(map[string]struct{})}
loop:
	for _, profile := range known {
		if profile.Format != p.Format {
			continue
		}
		if profile.Os != p.Os {
			continue
		}
		if profile.Arch != p.Arch {
			continue
		}
		for library := range profile.Libraries {
			// Current implementation requires exact library name and version match.
			if _, found := p.Libraries[library]; !found {
				continue loop
			}
		}
		result.Profiles[profile.Label] = struct{}{}
	}
	return result
}

// Describe returns a Description containing the profile that matches the
// current device.  It's declared as a variable so we can override it for
// testing.
var Describe = func() (device.Description, error) {
	empty := device.Description{}
	deviceProfile, err := ComputeDeviceProfile()
	if err != nil {
		return empty, err
	}
	knownProfiles, err := getKnownProfiles()
	if err != nil {
		return empty, err
	}
	result := matchProfiles(deviceProfile, knownProfiles)
	if len(result.Profiles) == 0 {
		// For now, return "unknown" as the profile, if no known profile
		// matches the device's profile.
		//
		// TODO(caprita): Get rid of this crutch once we have profiles
		// defined for our supported systems; for now it helps us make
		// the integration test work on e.g. Mac.
		result.Profiles["unknown"] = struct{}{}
	}
	return result, nil
}
