// Copyright 2022 The Chromium OS 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 (
	"flag"
	"fmt"
	"log"
	"path"

	"chromiumos/scanning/hwtests"
	"chromiumos/scanning/utils"
)

// Tests each scan source of a scanner to make sure the scanning behavior
// conforms to the WWCB specification. Each scan source should be at least
// letter-sized.
func main() {
	identifierFlag := flag.String("identifier", "", "Substring of the identifier printed by lorgnette_cli of the scanner to test.")
	flag.Parse()

	logFile, err := utils.CreateLogFile("test_scan_source")
	if err != nil {
		log.Fatal(err)
	}

	log.SetOutput(logFile)
	fmt.Printf("Created log file at: %s\n", logFile.Name())

	listOutput, err := utils.LorgnetteCLIList()
	if err != nil {
		log.Fatal(err)
	}

	scannerInfo, err := utils.GetLorgnetteScannerInfo(listOutput, *identifierFlag)
	if err != nil {
		log.Fatal(err)
	}

	log.Print("INFO: Testing scanner: ", scannerInfo.ToLorgnetteScannerName())

	rawLorgnetteCaps, err := utils.LorgnetteCLIGetJSONCaps(scannerInfo.ToLorgnetteScannerName())
	if err != nil {
		log.Fatal(err)
	}

	lorgnetteCaps, err := utils.ParseLorgnetteCapabilities(rawLorgnetteCaps)
	if err != nil {
		log.Fatal(err)
	}

	outputDir := path.Dir(logFile.Name())
	tests := map[string]utils.TestFunction{
		"PlatenScanSource":     hwtests.AllScanCombinationsTest(lorgnetteCaps.PlatenCaps, "Platen", scannerInfo.ToLorgnetteScannerName(), outputDir),
		"AdfSimplexScanSource": hwtests.AllScanCombinationsTest(lorgnetteCaps.AdfSimplexCaps, "ADF Simplex", scannerInfo.ToLorgnetteScannerName(), outputDir),
		"AdfDuplexScanSource":  hwtests.AllScanCombinationsTest(lorgnetteCaps.AdfDuplexCaps, "ADF Duplex", scannerInfo.ToLorgnetteScannerName(), outputDir)}
	failed := []string{}
	skipped := []string{}
	errors := []string{}

	for name, test := range tests {
		testResult := utils.RunTest(name, test)
		if testResult == utils.Failed {
			failed = append(failed, name)
		} else if testResult == utils.Skipped {
			skipped = append(skipped, name)
		} else if testResult == utils.Error {
			errors = append(errors, name)
		}
	}

	fmt.Printf("Ran %d tests.\n", len(tests))
	if len(failed) != 0 {
		fmt.Printf("%d tests failed:\n", len(failed))
		for _, failedTest := range failed {
			fmt.Println(failedTest)
		}
	}
	if len(skipped) != 0 {
		fmt.Printf("%d tests skipped:\n", len(skipped))
		for _, skippedTest := range skipped {
			fmt.Println(skippedTest)
		}
	}
	if len(errors) != 0 {
		fmt.Printf("%d tests had errors:\n", len(errors))
		for _, errorTest := range errors {
			fmt.Println(errorTest)
		}
	}
}
