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

// ninjatrace converts .ninja_log into trace-viewer formats.
//
// usage:
//  $ go run ninjatrace.go --filename out/debug-x64/.ninja_log
//
package main

import (
	"bufio"
	"compress/gzip"
	"encoding/json"
	"flag"
	"io"
	"log"
	"os"
	"path/filepath"
	"runtime/pprof"

	"go.fuchsia.dev/tools/ninjalog"
)

var (
	filename   = flag.String("filename", ".ninja_log", "filename of .ninja_log")
	traceJSON  = flag.String("trace-json", "trace.json", "output filename of trace.json")
	cpuprofile = flag.String("cpuprofile", "", "file to write cpu profile")
)

func reader(fname string, rd io.Reader) (io.Reader, error) {
	if filepath.Ext(fname) != ".gz" {
		return bufio.NewReaderSize(rd, 512*1024), nil
	}
	return gzip.NewReader(bufio.NewReaderSize(rd, 512*1024))
}

func convert(fname string) ([]ninjalog.Trace, error) {
	f, err := os.Open(fname)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	rd, err := reader(fname, f)
	if err != nil {
		return nil, err
	}

	njl, err := ninjalog.Parse(fname, rd)
	if err != nil {
		return nil, err
	}
	steps := ninjalog.Dedup(njl.Steps)
	flow := ninjalog.Flow(steps)
	return ninjalog.ToTraces(flow, 1), nil
}

func output(fname string, traces []ninjalog.Trace) (err error) {
	f, err := os.Create(fname)
	if err != nil {
		return err
	}
	defer func() {
		cerr := f.Close()
		if err == nil {
			err = cerr
		}
	}()
	js, err := json.Marshal(traces)
	if err != nil {
		return err
	}
	_, err = f.Write(js)
	return err
}

func main() {
	flag.Parse()

	if *cpuprofile != "" {
		f, err := os.Create(*cpuprofile)
		if err != nil {
			log.Fatal(err)
		}
		pprof.StartCPUProfile(f)
		defer pprof.StopCPUProfile()
	}

	traces, err := convert(*filename)
	if err != nil {
		log.Fatal(err)
	}
	if *traceJSON != "" {
		err = output(*traceJSON, traces)
		if err != nil {
			log.Fatal(err)
		}
	}
}
