package dialectsfcrm

import "testing"

func TestReportRequestAdapterParsesSalesforceReportMetadataEnvelope(t *testing.T) {
	adapter := NewReportRequestAdapter()

	req, err := adapter.ParseReportDefinitionRequest([]byte(`{
		"reportMetadata": {
			"name": "Pipeline",
			"developerName": "Pipeline",
			"folderId": "00lxx0000000001AAA",
			"description": "Pipeline report",
			"reportType": { "type": "OpportunityReport" },
			"reportFormat": "SUMMARY",
			"scope": "mine",
			"detailColumns": ["Opportunity.Name", "AMOUNT"],
			"reportFilters": [
				{"column": "StageName", "operator": "equals", "value": "Prospecting"}
			],
			"groupingsDown": [
				{ "name": "STAGE_NAME", "dateGranularity": "None" }
			],
			"standardDateFilter": {
				"column": "CloseDate",
				"durationValue": "CUSTOM",
				"startDate": "2026-01-01",
				"endDate": "2026-01-31"
			}
		}
	}`))
	if err != nil {
		t.Fatalf("ParseReportDefinitionRequest: %v", err)
	}
	if req.Definition.Name != "Pipeline" {
		t.Fatalf("Name = %q, want Pipeline", req.Definition.Name)
	}
	if req.DeveloperName != "Pipeline" {
		t.Fatalf("DeveloperName = %q, want Pipeline", req.DeveloperName)
	}
	if req.FolderID != "00lxx0000000001AAA" {
		t.Fatalf("FolderID = %q, want folder id", req.FolderID)
	}
	if req.Description != "Pipeline report" {
		t.Fatalf("Description = %q, want Pipeline report", req.Description)
	}
	if req.Definition.SourceRef != "OpportunityReport" {
		t.Fatalf("SourceRef = %q, want OpportunityReport", req.Definition.SourceRef)
	}
	if req.Definition.DisplayMode != "SUMMARY" {
		t.Fatalf("DisplayMode = %q, want SUMMARY", req.Definition.DisplayMode)
	}
	if req.Definition.SourceObject != "Opportunity" {
		t.Fatalf("SourceObject = %q, want Opportunity", req.Definition.SourceObject)
	}
	if len(req.Definition.Columns) != 2 || req.Definition.Columns[0] != "Opportunity.Name" || req.Definition.Columns[1] != "AMOUNT" {
		t.Fatalf("Columns = %+v, want Opportunity.Name and AMOUNT", req.Definition.Columns)
	}
	if len(req.Definition.Filters) != 1 || req.Definition.Filters[0].Column != "StageName" ||
		req.Definition.Filters[0].Operator != "equals" || req.Definition.Filters[0].Value != "Prospecting" {
		t.Fatalf("Filters = %+v, want StageName equals Prospecting", req.Definition.Filters)
	}
	if len(req.Definition.Grouping) != 1 || req.Definition.Grouping[0] != "STAGE_NAME" {
		t.Fatalf("Grouping = %+v, want STAGE_NAME", req.Definition.Grouping)
	}
	if req.Definition.DateFilter == nil || req.Definition.DateFilter.Column != "CloseDate" ||
		req.Definition.DateFilter.Preset != "CUSTOM" {
		t.Fatalf("DateFilter = %+v, want CloseDate custom filter", req.Definition.DateFilter)
	}
	if !req.Fields.DeveloperName || !req.Fields.FolderID || !req.Fields.Description || !req.Fields.Grouping {
		t.Fatalf("Fields = %+v, want Salesforce metadata fields marked present", req.Fields)
	}
}

func TestReportRequestAdapterParsesSalesforceExecutionRequest(t *testing.T) {
	adapter := NewReportRequestAdapter()

	req, err := adapter.ParseReportExecutionRequest([]byte(`{
		"reportId": "00Oxx0000000001AAA",
		"limit": 25,
		"reportMetadata": {
			"reportType": "CaseList",
			"detailColumns": ["CaseNumber"]
		}
	}`))
	if err != nil {
		t.Fatalf("ParseReportExecutionRequest: %v", err)
	}
	if req.ReportID != "00Oxx0000000001AAA" {
		t.Fatalf("ReportID = %q, want saved report id", req.ReportID)
	}
	if req.Limit != 25 {
		t.Fatalf("Limit = %d, want 25", req.Limit)
	}
	if req.Definition == nil {
		t.Fatal("Definition = nil, want parsed override")
	}
	if req.Definition.Definition.SourceRef != "CaseList" {
		t.Fatalf("SourceRef = %q, want CaseList", req.Definition.Definition.SourceRef)
	}
	if req.Definition.Definition.SourceObject != "Case" {
		t.Fatalf("SourceObject = %q, want Case", req.Definition.Definition.SourceObject)
	}
	if len(req.Definition.Definition.Columns) != 1 || req.Definition.Definition.Columns[0] != "CaseNumber" {
		t.Fatalf("Columns = %+v, want [CaseNumber]", req.Definition.Definition.Columns)
	}
}
