package render

import (
	"context"
	"fmt"
	"os"
	"reflect"

	"github.com/lensesio/tableprinter"
	"github.com/pingcap-inc/checker/proto"
	"github.com/sirupsen/logrus"
)

type Render interface {
	Output(data map[string]interface{}) error
}

type ScreenRender struct {
	logger logrus.StdLogger
	source <-chan map[string]proto.RuleResult
	//	printer *tableprinter.Printer
}

func NewScreenRender(source <-chan map[string]proto.RuleResult) *ScreenRender {
	// printer := tableprinter.New(os.Stdout)
	// header := tableprinter.StructParser.ParseHeaders(reflect.ValueOf(&proto.DeployResult{}))
	// printer.Render(header, nil, nil, false)
	return &ScreenRender{
		logger: logrus.StandardLogger(),
		source: source,
		//printer: printer,
	}
}

// change to channel
func (r *ScreenRender) Output(ctx context.Context) error {
	for {
		select {
		case data, ok := <-r.source:
			if !ok {
				return nil
			}
			for _, result := range data {
				fmt.Println("# Configuration Check Result")
				fmt.Println("- RuleName: ", result.RuleName)
				fmt.Println("- RuleId: ", result.RuleId)
				fmt.Println("- Variation: ", result.Variation)
				fmt.Println("- Alerting Rule: ", result.AlertingRule)
				fmt.Println("- Check Result: ")
				printer := tableprinter.New(os.Stdout)
				// _ := tableprinter.StructParser.ParseHeaders(reflect.ValueOf(&proto.DeployResult{}))
				// printer.Render(header, nil, nil, false)
				for _, rr := range result.DeployResults {
					row, nums := tableprinter.StructParser.ParseRow(reflect.ValueOf(rr))
					printer.RenderRow(row, nums)
				}
				fmt.Print("\n")
			}
		case <-ctx.Done():
			return nil
		}
	}

}
