package main

import (
  "bufio"
  "flag"
  "fmt"
  "io"
  "log"
  "os"
  "regexp"
  "strings"
)

// Generates the manifest.json file according to the dependencies passed
// via CLI arguments

const (
  manifestTemplate = "templates/manifest.gjson"
)

var beginningOfIfStatement = regexp.MustCompile(`^\s*#if defined\(([^\(\)]*)\)\s*$`)
var endOfIfStatement = regexp.MustCompile(`^\s*#endif\s*$`)

var (
  quietMode = flag.Bool("quiet", false, "Quiet mode")
  destFile  = flag.String("dest", "", "Destination file")
)

func FindWithCaseFolding(slice []string, val string) bool {
  for _, item := range slice {
    if strings.EqualFold(item, val) {
      return true
    }
  }
  return false
}

func WriteManifest(template io.Reader, dest io.Writer, dependencies []string) error {
  level := 0
  activeLevel := 0
  scanner := bufio.NewScanner(template)
  for scanner.Scan() {
    line := scanner.Text()
    considerLine := false
    if m := beginningOfIfStatement.FindStringSubmatch(line); m != nil {
      if level == activeLevel {
        statementDeps := m[1]
        deps := strings.Split(statementDeps, "||")
        for _, dep := range deps {
          dep = strings.TrimSpace(dep)
          if FindWithCaseFolding(dependencies, dep) {
            activeLevel++
            break
          }
        }
      }
      level++
    } else if m := endOfIfStatement.MatchString(line); m {
      if activeLevel == level {
        activeLevel--
      }
      level--
    } else {
      considerLine = level == activeLevel
    }

    if considerLine {
      _, err := io.WriteString(dest, line + "\n")
      if err != nil {
        return fmt.Errorf("Can't write manifest: %v", err)
      }
    }
  }

  return nil
}

func main() {
  log.SetPrefix("generateManifest: ")
  log.SetFlags(0)

  flag.Parse()
  dependencies := flag.Args()

  if len(dependencies) == 0 {
    log.Fatalf("Pass the dependencies as arguments (for instance, run `go run generateManifest.go CHROMIUM`).")
  }

  if *destFile == "" {
    log.Fatalf("Pass the destination file name via the -dest flag.")
  }

  template, err := os.Open(manifestTemplate)
  if err != nil {
    log.Fatalf("Couldn't open file %v: %v", manifestTemplate, err)
  }
  defer template.Close()

  dest, err := os.Create(*destFile)
  if err != nil {
    log.Fatalf("Couldn't create file %v: %v", *destFile, err)
  }
  defer dest.Close()

  err = WriteManifest(template, dest, dependencies)
  if err != nil {
    log.Fatalf("%v", err)
  } else if !*quietMode {
    log.Println("Manifest has been generated successfully")
  }
}
