// 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/magic-submodule.c", "BaseMagicSubmoduleC"},
		{"../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")
		}
	}
}
