package analytics

import (
	"context"
	"testing"

	"github.com/nexuscrm/shared/pkg/models"
)

func TestCRTSynthesizerUsesMetadataJoinTemplate(t *testing.T) {
	crt := &models.SystemReportType{
		FullName:   "AppPackCrossObjectReport",
		BaseObject: "AnyObject",
		Metadata: `{
			"joinTemplate": {
				"PrimaryTable": "primary_table",
				"PrimaryAlias": "p",
				"Joins": [
					{"Table":"child_table","Alias":"c","JoinType":"LEFT JOIN","OnLeft":"c.ParentId","OnRight":"p.Id"}
				],
				"Columns": {
					"PRIMARY_NAME": {"TableAlias":"p","Column":"Name"},
					"CHILD_NAME": {"TableAlias":"c","Column":"Name"}
				}
			}
		}`,
	}

	tmpl, warnings := (&crtSynthesizer{}).Synthesize(context.Background(), crt)
	if len(warnings) != 0 {
		t.Fatalf("warnings = %#v, want none", warnings)
	}
	if tmpl == nil {
		t.Fatal("template is nil")
	}
	if tmpl.PrimaryTable != "primary_table" || tmpl.PrimaryAlias != "p" {
		t.Fatalf("primary = %s/%s, want primary_table/p", tmpl.PrimaryTable, tmpl.PrimaryAlias)
	}
	if len(tmpl.Joins) != 1 || tmpl.Joins[0].Table != "child_table" {
		t.Fatalf("joins = %#v", tmpl.Joins)
	}
	if qc, ok := tmpl.Columns["CHILD_NAME"]; !ok || qc.TableAlias != "c" || qc.Column != "Name" {
		t.Fatalf("CHILD_NAME column = %#v, present=%v", qc, ok)
	}
}

func TestCRTSynthesizerRejectsMetadataSelectExprWithoutOwnerPack(t *testing.T) {
	crt := &models.SystemReportType{
		FullName:   "AdminAuthoredReportType",
		BaseObject: "AnyObject",
		Metadata:   "{\"joinTemplate\":{\"PrimaryTable\":\"primary_table\",\"PrimaryAlias\":\"p\",\"Columns\":{\"DISPLAY\":{\"SelectExpr\":\"CONCAT(`p`.`Name`, '')\"}}}}",
	}

	tmpl, warnings := (&crtSynthesizer{}).Synthesize(context.Background(), crt)
	if tmpl != nil {
		t.Fatalf("template = %#v, want nil", tmpl)
	}
	if len(warnings) != 1 || warnings[0].Code != WarnCRTColumnUnresolved {
		t.Fatalf("warnings = %#v, want one column warning", warnings)
	}
}
