package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"path"
)

const problemBaseCN = "https://leetcode-cn.com/problems/"
const problemBase = "https://leetcode.com/problems/"

func createQuestion(basePath string, item *Item, question *Question) error {
	titleSlug := item.Question.TitleSlug
	folder := path.Join(basePath, titleSlug)
	err := createFolder(folder)
	if err != nil {
		return err
	}
	defaultCode := parseDefaultCode(question.CodeDefinition)
	err = createSolutionFile(folder, defaultCode)
	if err != nil {
		return err
	}
	err = createReadmeFile(folder, item.Title, titleSlug, question.TranslatedContent)
	if err != nil {
		return err
	}
	return nil
}

func createFolder(folder string) error {
	err := os.Mkdir(folder, os.ModePerm)
	if err != nil {
		if os.IsExist(err) {
			fmt.Println("folder existed: ", folder)
			return err
		}
	}
	return nil
}

func createSolutionFile(folder, defaultCode string) error {
	solutionPath := path.Join(folder, "solution.go")
	f, err := os.Create(solutionPath)
	if err != nil {
		return fmt.Errorf("failed to create file: %s\n", solutionPath)
	}
	defer f.Close()
	w := bufio.NewWriter(f)
	fmt.Fprintln(w, "package main")
	fmt.Fprintln(w)
	fmt.Fprint(w, defaultCode)
	return w.Flush()
}

func createReadmeFile(folder, title, titleSlug, content string) error {
	readmePath := path.Join(folder, "readme.md")
	f, err := os.Create(readmePath)
	if err != nil {
		return fmt.Errorf("failed to create file: %s\n", readmePath)
	}
	defer f.Close()
	w := bufio.NewWriter(f)
	fmt.Fprintln(w, "## "+title)
	fmt.Fprintln(w)
	fmt.Fprint(w, content)
	fmt.Fprintln(w)
	fmt.Fprintln(w,"-----")
	fmt.Fprintln(w)
	fmt.Fprintln(w, "### 链接:")
	fmt.Fprintln(w)
	fmt.Fprintln(w, "中文:"+problemBaseCN+titleSlug)
	fmt.Fprintln(w)
	fmt.Fprintln(w, "英文:"+problemBase+titleSlug)
	return w.Flush()
}

func parseDefaultCode(codeDeinition string) string {
	var CodeDefinitions []CodeDefinition
	bytes := []byte(codeDeinition)
	err := json.Unmarshal(bytes, &CodeDefinitions)
	if err != nil {
		fmt.Println("Failed to parse code definition json: ", err)
		return ""
	}
	for _, item := range CodeDefinitions {
		if item.Value == "golang" {
			return item.DefaultCode
		}
	}
	return ""
}

type CodeDefinition struct {
	Value       string
	Text        string
	DefaultCode string
}