// Copyright 2017 The Wuffs Authors.
//
// 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
//
//    https://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.

// +build ignore

package main

// gen.go converts "../base/*" to "data.go".
//
// Invoke it via "go generate".

import (
	"bytes"
	"fmt"
	"go/format"
	"io/ioutil"
	"os"
	"strings"
)

const columns = 1024

func main() {
	if err := main1(); err != nil {
		os.Stderr.WriteString(err.Error() + "\n")
		os.Exit(1)
	}
}

func main1() error {
	out := &bytes.Buffer{}
	out.WriteString("// Code generated by running \"go generate\". DO NOT EDIT.\n")
	out.WriteString("\n")
	out.WriteString("// Copyright 2017 The Wuffs Authors.\n")
	out.WriteString("//\n")
	out.WriteString("// Licensed under the Apache License, Version 2.0 (the \"License\");\n")
	out.WriteString("// you may not use this file except in compliance with the License.\n")
	out.WriteString("// You may obtain a copy of the License at\n")
	out.WriteString("//\n")
	out.WriteString("//    https://www.apache.org/licenses/LICENSE-2.0\n")
	out.WriteString("//\n")
	out.WriteString("// Unless required by applicable law or agreed to in writing, software\n")
	out.WriteString("// distributed under the License is distributed on an \"AS IS\" BASIS,\n")
	out.WriteString("// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n")
	out.WriteString("// See the License for the specific language governing permissions and\n")
	out.WriteString("// limitations under the License.\n")
	out.WriteString("\n")
	out.WriteString("package data\n")
	out.WriteString("\n")

	if err := genData(out); err != nil {
		return err
	}

	formatted, err := format.Source(out.Bytes())
	if err != nil {
		return err
	}
	return ioutil.WriteFile("data.go", formatted, 0644)
}

func genData(out *bytes.Buffer) error {
	files := []struct {
		filename, varname string
	}{
		{"../base/all-impl.c", "BaseAllImplC"},

		{"../base/fundamental-private.h", "BaseFundamentalPrivateH"},
		{"../base/fundamental-public.h", "BaseFundamentalPublicH"},
		{"../base/memory-private.h", "BaseMemoryPrivateH"},
		{"../base/memory-public.h", "BaseMemoryPublicH"},
		{"../base/image-private.h", "BaseImagePrivateH"},
		{"../base/image-public.h", "BaseImagePublicH"},
		{"../base/io-private.h", "BaseIOPrivateH"},
		{"../base/io-public.h", "BaseIOPublicH"},
		{"../base/range-private.h", "BaseRangePrivateH"},
		{"../base/range-public.h", "BaseRangePublicH"},
		{"../base/strconv-private.h", "BaseStrConvPrivateH"},
		{"../base/strconv-public.h", "BaseStrConvPublicH"},
		{"../base/token-private.h", "BaseTokenPrivateH"},
		{"../base/token-public.h", "BaseTokenPublicH"},

		{"../base/floatconv-submodule-code.c", "BaseFloatConvSubmoduleCodeC"},
		{"../base/floatconv-submodule-data.c", "BaseFloatConvSubmoduleDataC"},
		{"../base/intconv-submodule.c", "BaseIntConvSubmoduleC"},
		{"../base/pixconv-submodule.c", "BasePixConvSubmoduleC"},
		{"../base/utf8-submodule.c", "BaseUTF8SubmoduleC"},

		{"../auxiliary/base.cc", "AuxBaseCc"},
		{"../auxiliary/base.hh", "AuxBaseHh"},
		{"../auxiliary/cbor.cc", "AuxCborCc"},
		{"../auxiliary/cbor.hh", "AuxCborHh"},
		{"../auxiliary/json.cc", "AuxJsonCc"},
		{"../auxiliary/json.hh", "AuxJsonHh"},
	}

	prefixAfterEditing := []byte("// After editing this file,")
	prefixCopyright := []byte("// Copyright ")
	copyright := []byte(nil)

	for _, f := range files {
		in, err := ioutil.ReadFile(f.filename)
		if err != nil {
			return err
		}

		if !bytes.HasPrefix(in, prefixAfterEditing) {
			return fmt.Errorf("%s's contents do not start with %q", f.filename, prefixAfterEditing)
		}
		if i := bytes.Index(in, []byte("\n\n")); i >= 0 {
			in = in[i+2:]
		}

		if !bytes.HasPrefix(in, prefixCopyright) {
			return fmt.Errorf("%s's contents do not start with %q", f.filename, prefixCopyright)
		}
		if i := bytes.Index(in, []byte("\n\n")); i >= 0 {
			if len(copyright) == 0 {
				// Take only one of the two trailing '\n's.
				copyright = in[:i+1]
			}
			in = in[i+2:]
		}

		fmt.Fprintf(out, "const %s = \"\" +\n", f.varname)
		writeStringConst(out, in)
		out.WriteString("\"\"\n\n")
	}

	fmt.Fprintf(out, "var AuxNonBaseCcFiles = []string{\n")
	for _, f := range files {
		if strings.HasPrefix(f.varname, "Aux") &&
			strings.HasSuffix(f.varname, "Cc") &&
			(f.varname != "AuxBaseCc") {
			fmt.Fprintf(out, "%s,\n", f.varname)
		}
	}
	fmt.Fprintf(out, "}\n\n")

	fmt.Fprintf(out, "var AuxNonBaseHhFiles = []string{\n")
	for _, f := range files {
		if strings.HasPrefix(f.varname, "Aux") &&
			strings.HasSuffix(f.varname, "Hh") &&
			(f.varname != "AuxBaseHh") {
			fmt.Fprintf(out, "%s,\n", f.varname)
		}
	}
	fmt.Fprintf(out, "}\n\n")

	fmt.Fprintf(out, "const BaseCopyright = \"\" +\n")
	writeStringConst(out, copyright)
	out.WriteString("\"\"\n\n")
	return nil
}

var dashDashDashDash = []byte("// ----")

func writeStringConst(out *bytes.Buffer, s []byte) {
	for len(s) > 0 {
		remaining := []byte(nil)
		if i := bytes.Index(s[1:], dashDashDashDash); i >= 0 {
			s, remaining = s[:i+1], s[i+1:]
		}

		for len(s) > 0 {
			t := s
			if len(t) > columns {
				t = t[:columns]
			}
			s = s[len(t):]
			fmt.Fprintf(out, "%q +\n", t)
		}

		s = remaining
		if len(s) > 0 {
			out.WriteString("\"\" +\n")
		}
	}
}
