// Copyright 2020 The Monogon Project Authors.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// genosrelease provides rudimentary support to generate os-release files
// following the freedesktop spec from arguments and stamping
//
// https://www.freedesktop.org/software/systemd/man/os-release.html
package main

import (
	"flag"
	"fmt"
	"io/ioutil"
	"os"
	"strings"

	"github.com/joho/godotenv"
)

var (
	flagStatusFile = flag.String("status_file", "", "path to bazel workspace status file")
	flagOutFile    = flag.String("out_file", "os-release", "path to os-release output file")
	flagStampVar   = flag.String("stamp_var", "", "variable to use as version from the workspace status file")
	flagName       = flag.String("name", "", "name parameter (see freedesktop spec)")
	flagID         = flag.String("id", "", "id parameter (see freedesktop spec)")
)

func main() {
	flag.Parse()
	statusFileContent, err := ioutil.ReadFile(*flagStatusFile)
	if err != nil {
		fmt.Printf("Failed to open bazel workspace status file: %v\n", err)
		os.Exit(1)
	}
	statusVars := make(map[string]string)
	for _, line := range strings.Split(string(statusFileContent), "\n") {
		line = strings.TrimSpace(line)
		parts := strings.Fields(line)
		if len(parts) != 2 {
			continue
		}
		statusVars[parts[0]] = parts[1]
	}

	version, ok := statusVars[*flagStampVar]
	if !ok {
		fmt.Printf("%v key not set in bazel workspace status file\n", *flagStampVar)
		os.Exit(1)
	}
	// As specified by https://www.freedesktop.org/software/systemd/man/os-release.html
	osReleaseVars := map[string]string{
		"NAME":        *flagName,
		"ID":          *flagID,
		"VERSION":     version,
		"VERSION_ID":  version,
		"PRETTY_NAME": *flagName + " " + version,
	}
	osReleaseContent, err := godotenv.Marshal(osReleaseVars)
	if err != nil {
		fmt.Printf("Failed to encode os-release file: %v\n", err)
		os.Exit(1)
	}
	if err := ioutil.WriteFile(*flagOutFile, []byte(osReleaseContent), 0644); err != nil {
		fmt.Printf("Failed to write os-release file: %v\n", err)
		os.Exit(1)
	}
}
