package whl

import (
	"context"
	"path/filepath"

	"github.com/databricks/cli/bundle"
	"github.com/databricks/cli/bundle/config"
	"github.com/databricks/cli/bundle/libraries"
	"github.com/databricks/cli/libs/diag"
	"github.com/databricks/cli/libs/log"
)

type fromLibraries struct{}

func DefineArtifactsFromLibraries() bundle.Mutator {
	return &fromLibraries{}
}

func (m *fromLibraries) Name() string {
	return "artifacts.whl.DefineArtifactsFromLibraries"
}

func (*fromLibraries) Apply(ctx context.Context, b *bundle.Bundle) diag.Diagnostics {
	if len(b.Config.Artifacts) != 0 {
		log.Debugf(ctx, "Skipping defining artifacts from libraries because artifacts section is explicitly defined")
		return nil
	}

	tasks := libraries.FindAllWheelTasksWithLocalLibraries(b)
	for _, task := range tasks {
		for _, lib := range task.Libraries {
			matches, err := filepath.Glob(filepath.Join(b.RootPath, lib.Whl))
			// File referenced from libraries section does not exists, skipping
			if err != nil {
				continue
			}

			for _, match := range matches {
				name := filepath.Base(match)
				if b.Config.Artifacts == nil {
					b.Config.Artifacts = make(map[string]*config.Artifact)
				}

				log.Debugf(ctx, "Adding an artifact block for %s", match)
				b.Config.Artifacts[name] = &config.Artifact{
					Files: []config.ArtifactFile{
						{Source: match},
					},
					Type: config.ArtifactPythonWheel,
				}
			}
		}
	}

	return nil
}