package main

import (
	"encoding/json"
	"fmt"
	"os/exec"
	"path/filepath"
	"strings"

	"os"

	"gopkg.in/yaml.v2"

	cfg "github.com/jesusperez/cfgsrv"
	cvdata "github.com/jesusperez/cvdata"
	utils "github.com/jesusperez/datautils"
)

func createRootModels(config *cfg.Config) error {
	modelsFullPath := fmt.Sprintf("%s/%s",config.DataPath,config.DataModelsRoot)
	var models []cvdata.ModelType
	err := filepath.Walk(config.DataPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Println(err)
			return err
		}
		if info.IsDir() {
				if _, err := os.Stat(fmt.Sprintf("%s/core.yaml",path)); err == nil {
					if !strings.Contains(path,"lang") {
						name := filepath.Base(path)
						modelPath := strings.Replace(path,config.DataPath,"",-1)
						models = append(models, cvdata.ModelType{
							Id: name,
							Title: name,
							Path: fmt.Sprintf("~/%s",modelPath),
						})
					}
				}
		}
		return nil
	})
  if err != nil {
		fmt.Printf("Error create %s: %v\n",modelsFullPath, err)
    return err
  }
	var rootModels cvdata.Models
	rootModels.Models = models
	data, err := yaml.Marshal(rootModels)
	if err != nil {
		fmt.Printf("Error create yaml models data: %v\n", err)
		return err
	}
	dataModelsPath := fmt.Sprintf("%s/%s",config.DataPath,config.DataModelsRoot)
  if res := utils.WriteData(string(data),dataModelsPath) ; res != nil {
		fmt.Printf("Error write %s: %v\n", dataModelsPath, err)
		return res
	}	
	data, err = json.Marshal(rootModels)
	if err != nil {
		fmt.Printf("Error create json models data: %v\n", err)
		return err
	}
	dataModelsPath = fmt.Sprintf("%s/%s",config.DataDistPath,strings.Replace(config.DataModelsRoot,".yaml",".json",-1))
  if res := utils.WriteData(string(data),dataModelsPath) ; res != nil {
		fmt.Printf("Error write %s: %v\n", dataModelsPath, err)
		return res
	}	
	fmt.Printf("Root models write from %s\n", modelsFullPath)
	return nil
}
func genJsonModels(config *cfg.Config) error {
	if config.UseRepo && config.RepoPath != "" {
		var errgit error
	  var cmd *exec.Cmd
		if cmd,errgit = utils.GitPull(config.RepoPath,config.RepoName,config.BackgGit,config.QuietGit); errgit != nil {
	    fmt.Printf("Error pull %s (%s): %v\n", config.RepoPath, config.RepoName,errgit)
			if config.BackgGit {
				if errgit = cmd.Wait(); errgit != nil {
	  		  fmt.Printf("Error pull %s (%s): %v\n", config.RepoPath, config.RepoName,errgit)
				}
			}
		}
	}
	err := filepath.Walk(config.DataPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Println(err)
			return err
		}
		if info.IsDir() {
			if _, err := os.Stat(fmt.Sprintf("%s/core.yaml",path)); err == nil {
				if !strings.Contains(path,"lang") {
				  dir := filepath.Base(path)
					exclude := false
					for _,itm := range config.GenExcludeList {
						if itm == dir {
							exclude = true
							break
						}
					}
					if !exclude {
						if errjson := makeModelJson(config, dir, config.DataDistPath, true, false); errjson != nil {
							fmt.Printf("Error write cv %s: %v\n", dir, errjson)
						}
					}
				}
		  }
			return err
		}
		return nil
  }) 
	return err
}
func makeModelJson(cfg *cfg.Config, modelName string, genPath string, quiet bool, useRepo bool) error {
	cvdata, error := cvdata.LoadCVData(fmt.Sprintf("%s/%s",cfg.DataPath,modelName), cfg, useRepo)
	if error != nil {
		fmt.Printf("Error generating data %v\n", error)
	}
	data, err := json.Marshal(cvdata)
	if err != nil {
		fmt.Printf("Error Parse cv %s: %v\n", modelName, err)
		return err
	} else {
		err := utils.CheckDirPath(fmt.Sprintf("%s",genPath)) 
		if err == nil {
			path := fmt.Sprintf("%s/%s.json",genPath,modelName)
			if res := utils.WriteData(string(data),path) ; res != nil {
				fmt.Printf("Error write cv %s: %v\n", modelName, err)
		    return err
			} else {
				if quiet {
				  fmt.Printf("CV %s writed to: %s\n", modelName,path)
				}
			}
		} else {
			return err
		}
	}
	return nil
}
func gendata(runFlags RunFlags) int {
	cfg,err := loadDataConfig(runFlags)
	//fmt.Printf("Loaded config: %#v\n", cfg)
	if err != nil {
		return 1
	}
	errModel := createRootModels(cfg)
	if errModel != nil {
		return 1
	}
  errModel = makeModelJson(cfg, runFlags.modelName, runFlags.genPath,true,true) 
	if errModel != nil {
		return 1
	}
	return 0
}