package sqlite

import (
	"time"

	"git.phc.dm.unipi.it/phc/website/database"
	"git.phc.dm.unipi.it/phc/website/util"
	"github.com/jmoiron/sqlx"
)

type sqliteDBDispense struct{ *sqlx.DB }

var _ database.DBDispense = sqliteDBDispense{}

func (d sqliteDBDispense) Create(template database.Dispensa) (string, error) {
	template.Id = "dispensa/" + util.GenerateRandomString(8)
	template.CreatedAt = time.Now().Format(time.RFC3339)

	if _, err := d.DB.NamedExec(`
		INSERT INTO 
			dispense(id, created_at, owner_id, title, description) 
		VALUES 
			(:id, :created_at, :owner_id, :title, :description)
	`, &template); err != nil {
		return "", err
	}

	return template.Id, nil
}

func (d sqliteDBDispense) Get(id string) (database.Dispensa, error) {
	var dispensa database.Dispensa
	if err := d.DB.Get(&dispensa, `SELECT * FROM dispense WHERE id = ?`, id); err != nil {
		return database.Dispensa{}, err
	}

	return dispensa, nil
}

func (d sqliteDBDispense) All() ([]database.Dispensa, error) {
	var dispense []database.Dispensa
	if err := d.DB.Select(&dispense, `SELECT * FROM dispense`); err != nil {
		return nil, err
	}

	return dispense, nil
}

func (d sqliteDBDispense) Update(dispensa database.Dispensa) error {
	if _, err := d.DB.NamedExec(`
		UPDATE 
			dispense
		SET 
			owner_id = :owner_id
		   	title = :title,
		    description = :description
		WHERE 
			id = :id
	`, &dispensa); err != nil {
		return err
	}

	return nil
}

func (d sqliteDBDispense) Delete(id string) error {
	panic("TODO: Not implemented")
}