// 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
// (https://www.freedesktop.org/software/systemd/man/os-release.html) from arguments and stamping
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]
	}

	smalltownVersion, 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":     smalltownVersion,
		"VERSION_ID":  smalltownVersion,
		"PRETTY_NAME": *flagName + " " + smalltownVersion,
	}
	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)
	}
}
