package models

import (
	"errors"
	"time"

	"git.trj.tw/golang/utils/dbtool"
)

// Account - Account table struct
type Account struct {
	ID       string    `sql:"id" cc:"id"`
	Account  string    `sql:"account" cc:"account"`
	Password string    `sql:"password" cc:"-"`
	Nick     string    `sql:"nick" cc:"nick"`
	Email    string    `sql:"email" cc:"email"`
	Ctime    time.Time `sql:"ctime" cc:"ctime"`
	Mtime    time.Time `sql:"mtime" cc:"mtime"`
}

// GetAllAccount - all account
func GetAllAccount() ([]Account, error) {
	var accs []Account
	rows, err := x.Query(`select "id", "account", "password", "nick", "email", "ctime", "mtime" from "public"."account" where 1`)
	if err != nil {
		return nil, err
	}
	defer rows.Close()
	err = dbtool.ScanToStructAll(rows, &accs)
	return accs, nil
}

// GetAccount -
func GetAccount(account string) (acc *Account, err error) {
	acc = &Account{}

	rows, err := x.Query(`select "id", "account", "password", "nick", "email", "ctime", "mtime" from "public"."account" where "account" = $1`, account)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	ok, err := dbtool.ScanToStruct(rows, acc)
	if err != nil || !ok {
		return nil, err
	}

	return
}

// Get -
func (a *Account) Get() (bool, error) {
	rows, err := x.Query(`select "id", "account", "password", "nick", "email", "ctime", "mtime" from "public"."account" where "account" = $1`, a.Account)
	if err != nil {
		return false, err
	}
	defer rows.Close()

	ok, err := dbtool.ScanToStruct(rows, a)
	if err != nil {
		return false, err
	}

	return ok, nil
}

// Create -
func (a *Account) Create() error {
	row, err := x.Query(`insert into "public"."account" 
		("account", "password", "nick", "email") values ($1, $2, $3, $4) returning *`, a.Account, a.Password, a.Nick, a.Email)
	if err != nil {
		return err
	}
	defer row.Close()

	ok, err := dbtool.ScanToStruct(row, a)
	if err != nil {
		return err
	}
	if !ok {
		return errors.New("data returning fail")
	}

	return nil
}
