package config

import (
	"flag"
	"fmt"

	"git.paulbsd.com/paulbsd/qrz/utils"
	"github.com/jmoiron/sqlx"
	"gopkg.in/ini.v1"
)

// GetConfig fetch configuration
func (config *Config) GetConfig() error {
	var configfile string
	var nofeed bool
	var port int

	flag.Usage = utils.Usage

	flag.StringVar(&configfile, "configfile", "qrz.ini", "config file to use with qrz section")
	flag.IntVar(&port, "port", 8080, "web port to use")
	flag.BoolVar(&nofeed, "nofeed", false, "no feed database table with entries at first launch")
	flag.Parse()

	cfg, err := ini.Load(configfile)
	if err != nil {
		return err
	}

	qrzsection := cfg.Section("qrz")

	config.Port = port
	config.NoFeed = nofeed
	config.DbHostname = qrzsection.Key("db_hostname").MustString("localhost")
	config.DbName = qrzsection.Key("db_name").MustString("database")
	config.DbUsername = qrzsection.Key("db_username").MustString("username")
	config.DbPassword = qrzsection.Key("db_password").MustString("password")
	config.DbSchema = qrzsection.Key("db_schema").MustString("")
	config.DbTable = qrzsection.Key("db_table").MustString("qrz")
	config.Cron = qrzsection.Key("cron").MustString("@every 1h")

	config.DbSchema = fmt.Sprintf(`
		CREATE TABLE IF NOT EXISTS %[1]s (
			id serial NOT NULL PRIMARY KEY,
			qrz varchar(25) NOT NULL,
			name varchar(25) DEFAULT NULL,
			address varchar(50) DEFAULT NULL,
			city varchar(50) DEFAULT NULL,
			zipcode varchar(5) DEFAULT NULL,
			dept varchar(50) DEFAULT NULL,
			country varchar(25) DEFAULT NULL,
			dmrid varchar(25) DEFAULT NULL,
			fts tsvector NULL,
			CONSTRAINT qrz_unique UNIQUE(qrz, name, city, dept, country)
		);

		CREATE INDEX IF NOT EXISTS fts_idx ON %[1]s (fts);

		CREATE OR REPLACE FUNCTION updateFTS() RETURNS trigger AS $fts_trigger$
			BEGIN
				IF pg_trigger_depth() <> 1 THEN
        			RETURN NEW;
    			END IF;
				UPDATE %[1]s SET fts = to_tsvector(concat_ws(' ', qrz, name, city, dept, country)) WHERE id = NEW.id;
				RETURN NEW;
			END;
		$fts_trigger$ LANGUAGE plpgsql;

		DROP TRIGGER IF EXISTS fts_trigger ON %[1]s;

		CREATE TRIGGER fts_trigger
			AFTER INSERT ON %[1]s
			FOR EACH ROW EXECUTE PROCEDURE updateFTS();
		`,
		config.DbTable)

	config.DbStatements.Insert = fmt.Sprintf(`
		INSERT INTO %[1]s (qrz, dmrid, name, city, dept, country)
		VALUES ($1, $2, $3, $4, $5, $6);
		`,
		config.DbTable)

	config.DbStatements.ExportCSV = fmt.Sprintf(`
		SELECT qrz, name, city, dept, country
		FROM %[1]s;
		`,
		config.DbTable)

	config.DbStatements.Countries = fmt.Sprintf(`
		SELECT country
		FROM %[1]s
		GROUP BY country;
		`,
		config.DbTable)

	config.URLBase = `http://groupe-frs.hamstation.eu/index_qrz_liste_%s.php`

	config.QrzGroups = []string{"01", "03", "09", "103", "104", "107", "119", "13", "14", "146", "147", "15", "156", "16", "161", "163", "18", "188", "2", "214", "233", "25", "26", "29", "30", "31", "32", "34", "43", "44", "49", "54", "64", "66", "76", "79", "84", "97", "98"}
	//config.QrzGroups = map[string]string{"France": "14"}

	return nil
}

// Config is the global config of qrz
type Config struct {
	Db *sqlx.DB

	DbHostname   string
	DbName       string
	DbUsername   string
	DbPassword   string
	DbSchema     string
	DbTable      string
	DbStatements struct {
		Insert    string
		ExportCSV string
		Countries string
	}
	URLBase   string
	QrzGroups []string
	Cron      string
	Port      int
	NoFeed    bool
	Version   string
}