// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package project

import (
	"io/fs"
	"log"
	"path/filepath"
)

var AllProjects map[string]*Project
var FilteredProjects map[string]*Project

func init() {
	AllProjects = make(map[string]*Project)
	FilteredProjects = make(map[string]*Project)
}

func Initialize(c *ProjectConfig) error {
	Config = c
	return initializeReadmes()
}

// Projects are created using README.fuchsia files.
// Many projects in the fuchsia tree do not have a README.fuchsia file,
// or they are incorrectly formatted.
//
// You can setup custom README.fuchsia files in a special directory,
// point to them in the config file, and they'll be parsed here
// before the rest of check-licenses executes.
func initializeReadmes() error {
	for _, readmeCategory := range Config.Readmes {
		for _, readmePath := range readmeCategory.Paths {
			readmePath = filepath.Join(Config.FuchsiaDir, readmePath)
			if err := filepath.WalkDir(readmePath, func(currentPath string, info fs.DirEntry, err error) error {
				if err != nil {
					return err
				}

				if info.Name() == "README.fuchsia" {
					plusVal(NumInitCustomProjects, currentPath)
					projectRoot := filepath.Dir(currentPath)
					projectRoot, err = filepath.Rel(readmePath, projectRoot)
					if err != nil {
						return err
					}

					// The root project for the Fuchsia tree is special, since "currentPath" will be an empty string.
					if projectRoot == "." {
						projectRoot = Config.FuchsiaDir
					}

					if _, err := NewProject(currentPath, projectRoot); err != nil {
						// Don't error out with these custom README.fuchsia files, so we don't break rollers.
						log.Printf("Found issue with custom README.fuchsia file: %v: %v\n", currentPath, err)

						return nil
					}
				}
				return nil
			}); err != nil {
				return err
			}
		}
	}
	return nil
}
