// 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.

package main

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

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

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

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 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)
	}
}
