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

// igor is a tool that takes pairwise alignment data as produced by PALS or krishna
// and reports repeat feature family groupings in JSON format.
package main

import (
	"bytes"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"runtime"

	"golang.org/x/benchmarks/sweet/benchmarks/internal/driver"
	"golang.org/x/benchmarks/third_party/biogo-examples/igor/igor"

	"github.com/biogo/biogo/align/pals"
	"github.com/biogo/biogo/io/featio/gff"
)

const (
	band          = 0.05
	mergeOverlap  = 0
	removeOverlap = 0.95
	requiredCover = 0.95
	strictness    = 0

	pileDiff  = 0.05
	imageDiff = 0.05
)

func main() {
	driver.SetFlags(flag.CommandLine)
	flag.Parse()
	log.SetFlags(0)

	if flag.NArg() != 1 {
		log.Fatal("error: input GFF file required")
	}

	data, err := ioutil.ReadFile(flag.Arg(0))
	if err != nil {
		log.Fatalf("error: %v", err)
	}
	err = driver.RunBenchmark("BiogoIgor", func(_ *driver.B) error {
		r := bytes.NewReader(data)
		in := gff.NewReader(r)

		out := bytes.Buffer{}
		out.Grow(1024 * 1024)

		var pf pals.PairFilter
		piles, err := igor.Piles(in, mergeOverlap, pf)
		if err != nil {
			return fmt.Errorf("piling: %v", err)
		}

		_, clusters := igor.Cluster(piles, igor.ClusterConfig{
			BandWidth:         band,
			RequiredCover:     requiredCover,
			OverlapStrictness: strictness,
			OverlapThresh:     removeOverlap,
			Procs:             runtime.GOMAXPROCS(0),
		})
		cc := igor.Group(clusters, igor.GroupConfig{
			pileDiff,
			imageDiff,
			false,
		})
		err = igor.WriteJSON(cc, &out)
		if err != nil {
			return err
		}
		return nil
	}, driver.InProcessMeasurementOptions...)
	if err != nil {
		log.Fatalf("error: %v", err)
	}
}
