package postgres

import (
	"ai_developer_admin/models"
	"encoding/json"
	"fmt"
	"github.com/beego/beego/orm"
	"github.com/beego/beego/v2/core/logs"
	beego "github.com/beego/beego/v2/server/web"
	_ "github.com/lib/pq"
)

var ormpost orm.Ormer

func init() {
	//return
	logs.Debug("postgres lib init")
	orm.Debug = true
	if err := orm.RegisterDriver("postgres", orm.DRPostgres); err != nil {
		logs.Error(err.Error())
	}

	//orm.RegisterModel(new(models.Bills))
	//orm.RegisterModel(new(models.Tasks))
	//orm.RegisterModel(new(models.ChargeRecord))
	//orm.RegisterModel(new(models.UserLevel))
	//orm.RegisterModel(new(models.ApiKey))
	//orm.RegisterModel(new(models.JwtToken))

	logs.Debug("AppConfig", beego.AppConfig)

	dbuser, _ := beego.AppConfig.String("postgresuser")
	dbpass, _ := beego.AppConfig.String("postgrespass")
	dbhost, _ := beego.AppConfig.String("postgreshost")
	dbport, _ := beego.AppConfig.Int("postgresport")
	dbname, _ := beego.AppConfig.String("postgresdb")
	logs.Debug("postgres info", dbuser, dbpass, dbhost, dbport, dbname)

	dbURL := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", dbhost, dbport, dbuser, dbpass, dbname)
	logs.Debug("Will connect to postgres url", dbURL)

	if err := orm.RegisterDataBase(dbname, "postgres", dbURL); err != nil {
		logs.Error(err.Error())
		panic(err.Error())
	}
	orm.SetMaxIdleConns(dbname, 10)
	orm.SetMaxOpenConns(dbname, 100)

	db, err := orm.GetDB(dbname)
	if err != nil {
		panic(err)
	}
	ormpost, err = orm.NewOrmWithDB("postgres", dbname, db)
	if err != nil {
		panic(err)
	}
}

func QueryTset(sql string, args ...interface{}) ([]models.Bills, error) {
	logs.Debug("QueryBills = ", sql)
	qs := ormpost.Raw(sql, args)
	var params []orm.Params
	_, err := qs.Values(&params)
	if err != nil {
		return nil, err
	}
	arr, err := json.Marshal(params)
	if err != nil {
		return nil, err
	}
	var containers []models.Bills
	logs.Debug("QueryBills = ", string(arr))
	err = json.Unmarshal(arr, &containers)
	if err != nil {
		return nil, err
	}

	return containers, nil
}

func QueryBills(sql string) ([]models.Bills, error) {
	logs.Debug("QueryBills = ", sql)
	qs := ormpost.Raw(sql)
	var params []orm.Params
	_, err := qs.Values(&params)
	if err != nil {
		return nil, err
	}
	arr, err := json.Marshal(params)
	if err != nil {
		return nil, err
	}
	var containers []models.Bills
	logs.Debug("QueryBills = ", string(arr))
	err = json.Unmarshal(arr, &containers)
	if err != nil {
		return nil, err
	}

	return containers, nil
}

func CountTasks(sql string) ([]models.TaskCount, error) {
	logs.Debug("CountTasks = ", sql)
	qs := ormpost.Raw(sql)
	var params []orm.Params
	_, err := qs.Values(&params)
	if err != nil {
		return nil, err
	}
	arr, err := json.Marshal(params)
	if err != nil {
		return nil, err
	}
	var containers []models.TaskCount
	err = json.Unmarshal(arr, &containers)
	if err != nil {
		return nil, err
	}

	return containers, nil
}