package project

import (
	"context"
	"errors"
	"fmt"
	"io/fs"
	"os"
	"path/filepath"

	"github.com/databricks/cli/folders"
	"github.com/databricks/cli/libs/env"
	"github.com/databricks/cli/libs/log"
)

func projectInDevMode(ctx context.Context) (*Project, error) {
	cwd, err := os.Getwd()
	if err != nil {
		return nil, err
	}
	folder, err := folders.FindDirWithLeaf(cwd, "labs.yml")
	if err != nil {
		return nil, err
	}
	log.Debugf(ctx, "Found project under development in: %s", cwd)
	return Load(ctx, filepath.Join(folder, "labs.yml"))
}

func Installed(ctx context.Context) (projects []*Project, err error) {
	root, err := PathInLabs(ctx)
	if errors.Is(err, env.ErrNoHomeEnv) {
		return nil, nil
	} else if err != nil {
		return nil, err
	}
	labsDir, err := os.ReadDir(root)
	if err != nil && !errors.Is(err, fs.ErrNotExist) {
		return nil, err
	}
	projectDev, err := projectInDevMode(ctx)
	if err != nil && !errors.Is(err, fs.ErrNotExist) {
		return nil, err
	}
	if err == nil {
		projects = append(projects, projectDev)
	}
	for _, v := range labsDir {
		if !v.IsDir() {
			continue
		}
		if projectDev != nil && v.Name() == projectDev.Name {
			continue
		}
		labsYml := filepath.Join(root, v.Name(), "lib", "labs.yml")
		prj, err := Load(ctx, labsYml)
		if errors.Is(err, fs.ErrNotExist) {
			continue
		}
		if err != nil {
			return nil, fmt.Errorf("%s: %w", v.Name(), err)
		}
		projects = append(projects, prj)
	}
	return projects, nil
}