package driver

import (
	"encoding/json"
	"log"
	"os"
	"regexp"
)

type Step struct {
	Input           string `json:"input"`
	ExpectedContent string `json:"expectedContent"`
}

func (s *Step) MatchesExpectedContent(content []byte) (bool, error) {
	pattern := regexp.QuoteMeta(s.ExpectedContent)
	re, err := regexp.Compile(pattern)
	if err != nil {
		return false, err
	}
	if re.Match([]byte(content)) {
		return true, nil
	}
	return false, nil
}

// Group represents a group of steps
type Group struct {
	Name  string `json:"name"`
	Steps []Step `json:"steps"`
}

type TestCase struct {
	Name            string
	Input           string
	ExpectedContent string
}

func (s *TestCase) MatchesExpectedContent(content []byte) (bool, error) {
	pattern := regexp.QuoteMeta(s.ExpectedContent)
	re, err := regexp.Compile(pattern)
	if err != nil {
		return false, err
	}
	// Check if the content matches the regex pattern
	if re.Match(content) {
		return true, nil
	}
	return false, nil
}

// DataGroup represents the overall structure of the JSON.
type DataGroup struct {
	Groups []Group `json:"groups"`
}

type Session struct {
	Name   string  `json:"name"`
	Groups []Group `json:"groups"`
}

func ReadData() []Session {
	data, err := os.ReadFile("test_setup.json")
	if err != nil {
		log.Fatalf("Failed to read file: %v", err)
	}
	// Unmarshal JSON data
	var sessions []Session
	err = json.Unmarshal(data, &sessions)
	if err != nil {
		log.Fatalf("Failed to unmarshal JSON: %v", err)
	}

	return sessions
}

func FilterGroupsByName(groups []Group, name string) []Group {
	var filteredGroups []Group
	for _, group := range groups {
		if group.Name == name {
			filteredGroups = append(filteredGroups, group)
		}
	}
	return filteredGroups
}

func LoadTestGroups(filePath string) (DataGroup, error) {
	var sessionsData DataGroup
	data, err := os.ReadFile(filePath)
	if err != nil {
		return sessionsData, err
	}
	err = json.Unmarshal(data, &sessionsData)
	return sessionsData, err
}

func CreateTestCases(group DataGroup) []TestCase {
	var tests []TestCase
	for _, group := range group.Groups {
		for _, step := range group.Steps {
			// Create a test case for each group
			tests = append(tests, TestCase{
				Name:            group.Name,
				Input:           step.Input,
				ExpectedContent: step.ExpectedContent,
			})
		}
	}

	return tests
}