package wrap

import (
	"github.com/30x/apid-core"
	"github.com/mattn/go-sqlite3"
	"database/sql/driver"
)

type wrapConn struct {
	*sqlite3.SQLiteConn
	log apid.LogService
}

func (c *wrapConn) Swap(cc *sqlite3.SQLiteConn) {
	c.SQLiteConn = cc
}

func (c *wrapConn) Prepare(query string) (driver.Stmt, error) {
	c.log.Debugf("begin prepare stmt: %s", query)

	stmt, err := c.SQLiteConn.Prepare(query)
	if err != nil {
		c.log.Errorf("prepare stmt failed: %s", err)
		return nil, err
	}

	c.log.Debug("end prepare stmt")
	s := stmt.(*sqlite3.SQLiteStmt)
	return &wrapStmt{s, c.log}, nil
}

func (c *wrapConn) Begin() (driver.Tx, error) {
	c.log.Debug("begin trans")

	tx, err := c.SQLiteConn.Begin()
	if err != nil {
		c.log.Errorf("begin trans failed: %s", err)
		return nil, err
	}

	c.log.Debug("end begin trans")
	t := tx.(*sqlite3.SQLiteTx)
	return &wrapTx{t, c.log}, nil
}

func (c *wrapConn) Close() (err error) {
	c.log.Debug("begin close")

	if err = c.SQLiteConn.Close(); err != nil {
		c.log.Errorf("close failed: %s", err)
		return
	}

	c.log.Debug("end close")
	return
}

func (c *wrapConn) Query(query string, args []driver.Value) (driver.Rows, error) {
	c.log.Debugf("query: %s args: %#v", query, args)
	return c.SQLiteConn.Query(query, args)
}
