// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build !plan9

package main

import (
	"bufio"
	"flag"
	"fmt"
	"os"
	"strings"

	"golang.org/x/benchmarks/sweet/benchmarks/internal/driver"

	lua "github.com/yuin/gopher-lua"
)

var short bool

func init() {
	flag.BoolVar(&short, "short", false, "whether to run a short version of this benchmark")
}

func parseFlags() error {
	flag.Parse()
	if flag.NArg() != 2 {
		return fmt.Errorf("expected lua program and input for it")
	}
	return nil
}

func parseInput(inputfile string) (string, error) {
	f, err := os.Open(inputfile)
	if err != nil {
		return "", err
	}
	defer f.Close()
	var builder strings.Builder
	scanner := bufio.NewScanner(f)
	for scanner.Scan() {
		_, err := builder.Write(scanner.Bytes())
		if err != nil {
			return "", err
		}
	}
	return builder.String(), nil
}

func doBenchmark(s *lua.LState, input lua.LString) error {
	freq := lua.P{
		Fn:      s.GetGlobal("frequency"),
		NRet:    0,
		Protect: true,
	}
	count := lua.P{
		Fn:      s.GetGlobal("count"),
		NRet:    0,
		Protect: true,
	}
	if err := s.CallByParam(freq, input, lua.LNumber(1)); err != nil {
		return err
	}
	if short {
		return nil
	}
	if err := s.CallByParam(freq, input, lua.LNumber(2)); err != nil {
		return err
	}
	if err := s.CallByParam(count, input, lua.LString("GGT")); err != nil {
		return err
	}
	if err := s.CallByParam(count, input, lua.LString("GGTA")); err != nil {
		return err
	}
	if err := s.CallByParam(count, input, lua.LString("GGTATT")); err != nil {
		return err
	}
	return nil
}

func run(luafile, inputfile string) error {
	s := lua.NewState()
	defer s.Close()
	if err := s.DoFile(luafile); err != nil {
		return err
	}
	input, err := parseInput(inputfile)
	if err != nil {
		return err
	}
	return driver.RunBenchmark("GopherLuaKNucleotide", func(_ *driver.B) error {
		return doBenchmark(s, lua.LString(input))
	}, driver.InProcessMeasurementOptions...)
}

func main() {
	driver.SetFlags(flag.CommandLine)
	if err := parseFlags(); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
	if err := run(flag.Arg(0), flag.Arg(1)); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}
}
