package models

import (
	"context"

	"github.com/uptrace/bun"
)

type Item struct {
	bun.BaseModel `bun:"table:items"`
	ItemID        int64   `bun:",pk,autoincrement" json:"item_id" yaml:"item_id"`
	ReceiptID     int64   `json:"receipt_id" yaml:"receipt_id"`
	Title         string  `bun:"item,type:text" json:"item" yaml:"item"`
	Quantity      float64 `bun:"quantity" json:"quantity" yaml:"quantity"`
	Price         float64 `bun:"price" json:"price" yaml:"price"`
	Category      string  `bun:"category" json:"category" yaml:"category"`
}

type Items []*Item

var _ bun.AfterCreateTableHook = (*Item)(nil)

func (*Item) AfterCreateTable(ctx context.Context, query *bun.CreateTableQuery) error {
	_, err := query.DB().NewCreateIndex().Model((*Item)(nil)).Index("idx_items_item").Column("item").Exec(ctx)
	if err != nil {
		return err
	}
	_, err = query.DB().NewCreateIndex().Model((*Item)(nil)).Index("idx_items_category").Column("category").Exec(ctx)
	if err != nil {
		return err
	}
	return nil
}

// Add .
func (i *Item) Add(db *bun.DB, ctx context.Context) error {
	_, err := db.NewInsert().Model(i).Exec(ctx)
	if err != nil {
		return err
	}
	return nil
}

// Update .
func (i *Item) Update(db *bun.DB, ctx context.Context) error {
	_, err := db.NewUpdate().Model(i).WherePK().Exec(ctx)
	if err != nil {
		return err
	}
	return nil
}

// Add .
func (i *Items) Add(db *bun.DB, ctx context.Context) error {
	_, err := db.NewInsert().Model(i).Exec(ctx)
	if err != nil {
		return err
	}
	return nil
}

// List .
func (i *Items) List(db *bun.DB, ctx context.Context, r int) (Items, error) {
	var items Items
	_, err := db.NewSelect().Model(&items).Where("receipt_id = ?", r).ScanAndCount(ctx)
	if err != nil {
		return nil, err
	}
	return items, nil
}

// Remove .
func (i *Items) Remove(db *bun.DB, ctx context.Context) error {
	_, err := db.NewDelete().Model(i).WherePK().Exec(ctx)
	if err != nil {
		return err
	}
	return nil
}
