/*
 * Copyright 2018 American Express
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package main

import (
	"fmt"
	"time"
)

// Result contains the final output of a Baton execution
type Result struct {
	httpResult        HTTPResult
	totalRequests     int
	timeTaken         time.Duration
	requestsPerSecond int
	hasStats          bool
	averageTime       float32
	minTime           int
	maxTime           int
}

func newResult() *Result {
	return &Result{*newHTTPResult(), 0, 0, 0, false, 0, 0, 0}
}

func (result *Result) printResults() {
	fmt.Println()
	fmt.Printf("=========================== Results ========================================\n")
	fmt.Println()
	fmt.Printf("Total requests:                            %10d\n", result.totalRequests)
	fmt.Printf("Time taken to complete requests:      %15s\n", result.timeTaken.String())
	fmt.Printf("Requests per second:                       %10d\n", result.requestsPerSecond)
	if result.hasStats {
		fmt.Printf("Max response time (ms):                    %10d\n", result.maxTime)
		fmt.Printf("Min response time (ms):                    %10d\n", result.minTime)
		fmt.Printf("Avg response time (ms):                        %6.2f\n", result.averageTime)
	}
	fmt.Println()
	fmt.Printf("========= Percentage of responses by status code ==========================\n")
	fmt.Println()
	fmt.Printf("Number of connection errors:               %10d\n", result.httpResult.connectionErrorCount)
	fmt.Printf("Number of 1xx responses:                   %10d\n", result.httpResult.status1xxCount)
	fmt.Printf("Number of 2xx responses:                   %10d\n", result.httpResult.status2xxCount)
	fmt.Printf("Number of 3xx responses:                   %10d\n", result.httpResult.status3xxCount)
	fmt.Printf("Number of 4xx responses:                   %10d\n", result.httpResult.status4xxCount)
	fmt.Printf("Number of 5xx responses:                   %10d\n", result.httpResult.status5xxCount)

	for i := 0; i < len(result.httpResult.responseTimesPercent); i++ {
		if result.httpResult.responseTimesPercent[i][0] > 0 {
			if i == 0 {
				fmt.Println()
				fmt.Printf("========= Percentage of responses received within a certain time (ms)======\n")
				fmt.Println()
			}
			fmt.Printf("%10d%% : %d ms\n", result.httpResult.responseTimesPercent[i][2], result.httpResult.responseTimesPercent[i][0])
		}
	}
	fmt.Println()

	fmt.Printf("===========================================================================\n")

}
