package project

import (
	"encoding/json"
	"io/ioutil"
	"path/filepath"
	"runtime"
	"strings"
)

// Project holds the data related to a Wails project
type Project struct {

	/*** Application Data ***/
	Name string `json:"name"`

	// Application HTML, JS and CSS filenames
	HTML           string `json:"html"`
	JS             string `json:"js"`
	CSS            string `json:"css"`
	BuildCommand   string `json:"frontend:build"`
	InstallCommand string `json:"frontend:install"`
	/*** Internal Data ***/

	// The path to the project directory
	Path string

	// The output filename
	OutputFilename string `json:"outputfilename"`

	// The type of application. EG: Desktop, Server, etc
	OutputType string

	// The platform to target
	Platform string
}

// Load the project from the current working directory
func Load(projectPath string) (*Project, error) {

	// Attempt to load project.json
	projectFile := filepath.Join(projectPath, "wails.json")
	rawBytes, err := ioutil.ReadFile(projectFile)
	if err != nil {
		return nil, err
	}

	// Unmarshal JSON
	var result Project
	err = json.Unmarshal(rawBytes, &result)
	if err != nil {
		return nil, err
	}

	// Fix up our project paths
	result.Path = filepath.ToSlash(projectPath) + "/"
	result.HTML = filepath.Join(projectPath, result.HTML)
	result.JS = filepath.Join(projectPath, result.JS)
	result.CSS = filepath.Join(projectPath, result.CSS)

	// Create default name if not given
	if result.Name == "" {
		result.Name = "wailsapp"
	}

	// Fix up OutputFilename
	switch runtime.GOOS {
	case "windows":
		if !strings.HasSuffix(result.OutputFilename, ".exe") {
			result.OutputFilename += ".exe"
		}
	case "darwin", "linux":
		if strings.HasSuffix(result.OutputFilename, ".exe") {
			result.OutputFilename = strings.TrimSuffix(result.OutputFilename, ".exe")
		}
	}

	// Return our project data
	return &result, nil
}
