package repl

import (
	"bytes"
	"strings"
	"testing"
)

func TestRun_SingleExpression(t *testing.T) {
	in := strings.NewReader("1 + 2\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "3") {
		t.Errorf("expected output to contain '3', got %q", got)
	}
}

func TestRun_MultipleExpressions(t *testing.T) {
	in := strings.NewReader("1 + 2\n3 * 4\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "3") {
		t.Errorf("expected output to contain '3', got %q", got)
	}
	if !strings.Contains(got, "12") {
		t.Errorf("expected output to contain '12', got %q", got)
	}
}

func TestRun_ErrorContinues(t *testing.T) {
	// First line has error, second is valid.
	in := strings.NewReader("1 +\n2 + 3\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "error:") {
		t.Errorf("expected output to contain 'error:', got %q", got)
	}
	if !strings.Contains(got, "5") {
		t.Errorf("expected output to contain '5' after error recovery, got %q", got)
	}
}

func TestRun_DivisionByZero(t *testing.T) {
	in := strings.NewReader("1 / 0\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "error:") {
		t.Errorf("expected output to contain 'error:', got %q", got)
	}
	if !strings.Contains(got, "division by zero") {
		t.Errorf("expected 'division by zero' in output, got %q", got)
	}
}

func TestRun_EmptyLine(t *testing.T) {
	// Empty lines should be skipped, not cause errors.
	in := strings.NewReader("\n1 + 1\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "2") {
		t.Errorf("expected output to contain '2', got %q", got)
	}
	// Should not contain any error.
	if strings.Contains(got, "error:") {
		t.Errorf("empty line should not produce error, got %q", got)
	}
}

func TestRun_Prompt(t *testing.T) {
	in := strings.NewReader("42\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, ">> ") {
		t.Errorf("expected prompt '>> ' in output, got %q", got)
	}
}

func TestRun_FloatResult(t *testing.T) {
	in := strings.NewReader("7 / 2\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "3.5") {
		t.Errorf("expected output to contain '3.5', got %q", got)
	}
}

func TestRun_InvalidCharacter(t *testing.T) {
	in := strings.NewReader("1 @ 2\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "error:") {
		t.Errorf("expected output to contain 'error:', got %q", got)
	}
}

func TestRun_EmptyInput(t *testing.T) {
	// No input at all — just EOF.
	in := strings.NewReader("")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	// Should just show the prompt and exit gracefully.
	if !strings.Contains(got, ">> ") {
		t.Errorf("expected at least one prompt, got %q", got)
	}
}

func TestRun_WholeIntegerNoTrailingZeros(t *testing.T) {
	// 2 + 3 = 5, should print "5" not "5.000000".
	in := strings.NewReader("2 + 3\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	// Result line is "5\n" (between prompts).
	if !strings.Contains(got, "5\n") {
		t.Errorf("expected '5\\n' in output, got %q", got)
	}
	// Should not contain "5.0"
	if strings.Contains(got, "5.0") {
		t.Errorf("expected no trailing zeros, got %q", got)
	}
}

// --- Function definition tests ---

func TestRun_DefineFunction(t *testing.T) {
	in := strings.NewReader("f(x) = x + 1\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "defined f") {
		t.Errorf("expected 'defined f' in output, got %q", got)
	}
}

func TestRun_DefineAndCallFunction(t *testing.T) {
	in := strings.NewReader("f(x) = x + 1\nf(5)\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "defined f") {
		t.Errorf("expected 'defined f' in output, got %q", got)
	}
	if !strings.Contains(got, "6") {
		t.Errorf("expected output to contain '6', got %q", got)
	}
}

func TestRun_DefineMultiParamAndCall(t *testing.T) {
	in := strings.NewReader("add(x, y) = x + y\nadd(3, 4)\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "defined add") {
		t.Errorf("expected 'defined add' in output, got %q", got)
	}
	if !strings.Contains(got, "7") {
		t.Errorf("expected output to contain '7', got %q", got)
	}
}

func TestRun_RedefineError(t *testing.T) {
	in := strings.NewReader("f(x) = x\nf(x) = x + 1\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "defined f") {
		t.Errorf("expected 'defined f' in output, got %q", got)
	}
	if !strings.Contains(got, "error:") {
		t.Errorf("expected 'error:' for redefinition, got %q", got)
	}
	if !strings.Contains(got, "already defined") {
		t.Errorf("expected 'already defined' in error, got %q", got)
	}
}

func TestRun_UndefinedFunctionError(t *testing.T) {
	in := strings.NewReader("f(1)\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "error:") {
		t.Errorf("expected 'error:' for undefined function, got %q", got)
	}
	if !strings.Contains(got, "undefined function") {
		t.Errorf("expected 'undefined function' in error, got %q", got)
	}
}

func TestRun_FuncCallInExpression(t *testing.T) {
	in := strings.NewReader("f(x) = x * 2\nf(3) + 1\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "7") {
		t.Errorf("expected output to contain '7', got %q", got)
	}
}

func TestRun_CrossFunctionCalls(t *testing.T) {
	in := strings.NewReader("double(x) = x * 2\nquad(x) = double(double(x))\nquad(3)\n")
	var out bytes.Buffer

	Run(in, &out)

	got := out.String()
	if !strings.Contains(got, "12") {
		t.Errorf("expected output to contain '12', got %q", got)
	}
}
