package python

import (
	"crypto/md5" //nolint: gosec
	"encoding/json"
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/pulumi/pulumi/pkg/v3/codegen/schema"
)

// Regress a problem of non-deterministic codegen (due to reordering).
// The schema is taken from `pulumi-aws` and minified to the smallest
// example that still reproduced the issue.
func TestGenResourceMappingsIsDeterministic(t *testing.T) {
	minimalSchema := `
        {
            "name": "aws",
			"version": "0.0.1",
            "meta": {
                "moduleFormat": "(.*)(?:/[^/]*)"
            },
            "resources": {
                "aws:acm/certificateValidation:CertificateValidation": {},
                "aws:acm/certificate:Certificate": {}
            },
            "language": {
                "python": {
                    "readme": ".."
                }
            }
        }`

	var pkgSpec schema.PackageSpec
	err := json.Unmarshal([]byte(minimalSchema), &pkgSpec)
	if err != nil {
		t.Error(err)
		return
	}

	generateInitHash := func() string {
		pkg, err := schema.ImportSpec(pkgSpec, nil)
		if err != nil {
			t.Error(err)
			return ""
		}

		files, err := GeneratePackage("tool", pkg, nil)
		if err != nil {
			t.Error(err)
			return ""
		}

		file, haveFile := files["pulumi_aws/__init__.py"]
		if !haveFile {
			t.Error("Cannot find pulumi_aws/__init__.py in the generated files")
			return ""
		}

		return fmt.Sprintf("%x", md5.Sum(file)) //nolint: gosec
	}

	h1 := generateInitHash()
	for i := 0; i < 16; i++ {
		assert.Equal(t, h1, generateInitHash())
	}
}
