package adif

import (
	"strings"
	"testing"
)

func TestParseSimple(t *testing.T) {
	src := `Header text here
Generated by HamLog
<EOH>
<CALL:5>F4XYZ<BAND:3>20m<MODE:3>SSB<QSO_DATE:8>20240101<TIME_ON:6>123456<EOR>
<call:4>K1AB<band:3>40m<mode:2>CW<qso_date:8>20240102<time_on:4>0930<eor>
`
	var got []Record
	err := Parse(strings.NewReader(src), func(r Record) error {
		got = append(got, r)
		return nil
	})
	if err != nil {
		t.Fatalf("parse: %v", err)
	}
	if len(got) != 2 {
		t.Fatalf("want 2 records, got %d", len(got))
	}
	if got[0]["call"] != "F4XYZ" || got[0]["band"] != "20m" || got[0]["mode"] != "SSB" {
		t.Errorf("record 0 mismatch: %+v", got[0])
	}
	if got[1]["call"] != "K1AB" || got[1]["time_on"] != "0930" {
		t.Errorf("record 1 mismatch: %+v", got[1])
	}
}

func TestParseValueWithAngleBracket(t *testing.T) {
	// Length-prefixed value can contain '<' and '>' bytes.
	src := `<EOH><CALL:5>F4XYZ<COMMENT:7>a<b>c<d<EOR>`
	var got []Record
	err := Parse(strings.NewReader(src), func(r Record) error {
		got = append(got, r)
		return nil
	})
	if err != nil {
		t.Fatalf("parse: %v", err)
	}
	if len(got) != 1 {
		t.Fatalf("want 1, got %d", len(got))
	}
	if got[0]["comment"] != "a<b>c<d" {
		t.Errorf("comment mismatch: %q", got[0]["comment"])
	}
}

func TestParseNoHeader(t *testing.T) {
	// Some loggers omit the header entirely — records before <EOH> are
	// discarded by design. Verify nothing is emitted in that case.
	src := `<CALL:5>F4XYZ<EOR>`
	var got int
	err := Parse(strings.NewReader(src), func(r Record) error {
		got++
		return nil
	})
	if err != nil {
		t.Fatalf("parse: %v", err)
	}
	if got != 0 {
		t.Errorf("expected 0 records without <EOH>, got %d", got)
	}
}

func TestParseTypedField(t *testing.T) {
	// <FIELD:LEN:TYPE> form (e.g. <FREQ:6:N>).
	src := `<EOH><CALL:5>F4XYZ<FREQ:6:N>14.250<EOR>`
	var got Record
	err := Parse(strings.NewReader(src), func(r Record) error {
		got = r
		return nil
	})
	if err != nil {
		t.Fatalf("parse: %v", err)
	}
	if got["freq"] != "14.250" {
		t.Errorf("freq mismatch: %q", got["freq"])
	}
}
