package ruleio

import (
	"strings"
	"testing"

	"github.com/prism/proxy/internal/store"
)

func TestParseLine(t *testing.T) {
	r, err := ParseLine("DOMAIN-SUFFIX,google.com,country:HK")
	if err != nil {
		t.Fatal(err)
	}
	if r.RuleType != "DOMAIN-SUFFIX" || r.Payload != "google.com" || r.Target != "country:HK" {
		t.Fatalf("unexpected %+v", r)
	}
}

func TestParseLineSkipsMatch(t *testing.T) {
	_, err := ParseLine("MATCH,DIRECT")
	if err == nil {
		t.Fatal("expected error")
	}
}

func TestParseText(t *testing.T) {
	rules, errs := ParseText("# comment\nDOMAIN,google.com,DIRECT\n\nDOMAIN-SUFFIX,foo.com,PROXY")
	if len(errs) != 0 {
		t.Fatal(errs)
	}
	if len(rules) != 2 {
		t.Fatalf("got %d rules", len(rules))
	}
}

func TestParseJSONDoc(t *testing.T) {
	rules, err := ParseJSON([]byte(`{"version":1,"rules":[{"rule_type":"DOMAIN","payload":"a.com","target":"DIRECT"}]}`))
	if err != nil {
		t.Fatal(err)
	}
	if len(rules) != 1 || rules[0].Target != "DIRECT" {
		t.Fatalf("unexpected %+v", rules)
	}
}

func TestExportText(t *testing.T) {
	text := ExportText([]store.Rule{{
		RuleType: "DOMAIN-SUFFIX",
		Payload:  "x.com",
		Target:   "PROXY",
		Enabled:  true,
	}})
	if !strings.Contains(text, "DOMAIN-SUFFIX,x.com,PROXY") {
		t.Fatalf("got %q", text)
	}
}

func TestToStoreRulesDefaultsEnabled(t *testing.T) {
	rules, errs := ToStoreRules([]ExportRule{{RuleType: "DOMAIN", Payload: "a.com", Target: "DIRECT"}})
	if len(errs) != 0 || len(rules) != 1 || !rules[0].Enabled {
		t.Fatalf("rules=%+v errs=%v", rules, errs)
	}
}
