package fileutil

import (
	"errors"
	"flag"
	"fmt"

	"github.com/BurntSushi/toml"
)

type Tiloader struct {
	// 配置文件中 tiloader 部分的结构体
	LogFile   string `toml:"log-file"`
	ErrFile   string `toml:"err-file"`
	WorkerNum int    `toml:"worker-num"`
	BatchSize int    `toml:"batch-size"`
	MaxError  int    `toml:"max-error"`
}

type Tidb struct {
	// 配置文件中 tidb 部分的结构体
	Host     string `toml:"host"`
	Port     int    `toml:"port"`
	User     string `toml:"user"`
	Password string `toml:"password"`
	Schema   string `toml:"schema"`
}

type Desc_File struct {
	// 配置文件中 desc_file 部分的结构体
	DescFilePath string `toml:"desc-file-path"`
	SkipLine     int    `toml:"skip-line"`
}

// 定义解析方法
type ConfigFileParser struct {
}

// toml 文件解析用
type ConfigFile struct {
	Tiloader
	Desc_File `toml:"desc_file"`
	Tidb      `toml:"tidb"`
}

func (configFileParser ConfigFileParser) Parse(path string) (ConfigFile, error) {
	fmt.Println("parse config file :" + path)

	// 初始化结构体，给了默认值
	// cfgFile := ConfigFile{}
	cfgFile := ConfigFile{
		Tiloader: Tiloader{
			LogFile:   "tiloader.log",
			ErrFile:   "tiloader.err",
			WorkerNum: 10,
			BatchSize: 100,
			MaxError:  1,
		},
		Desc_File: Desc_File{
			DescFilePath: "./desc_file.txt",
			SkipLine:     0,
		},
		Tidb: Tidb{
			Host:     "127.0.0.1",
			Port:     4000,
			User:     "root",
			Password: "",
			Schema:   "test",
		},
	}

	// 解析 toml 文件
	if _, err := toml.DecodeFile(path, &cfgFile); err != nil {
		fmt.Println("decode config file" + path + " faild")
		return cfgFile, err
	}

	return cfgFile, nil
}

type Config struct {
	*flag.FlagSet //`json:"-"`
	ConfigFile    string
}

// NewConfig creates a new config.
func NewConfig() *Config {
	cfg := &Config{}
	cfg.FlagSet = flag.NewFlagSet("tiloader", flag.ContinueOnError)
	fs := cfg.FlagSet

	// -config 指定配置文件
	fs.StringVar(&cfg.ConfigFile, "config", "", "Config file")

	return cfg
}

// Parse parses flag definitions from the argument list.
func (c *Config) Parse(arguments []string) error {
	// Parse first to get config file.
	err := c.FlagSet.Parse(arguments)
	if err != nil {
		return err
	}

	// Load config file if specified.
	if c.ConfigFile == "" {
		return errors.New("-config must not be empty")
	}

	if len(c.FlagSet.Args()) != 0 {
		return fmt.Errorf("'%s' is an invalid flag", c.FlagSet.Arg(0))
	}

	return nil
}
