package drops

import (
	"fmt"

	"dk/internal/database"
)

// Drop represents a drop item in the game
type Drop struct {
	ID    int
	Name  string
	Level int
	Type  int
	Att   string
}

// DropType constants for drop types
const (
	TypeConsumable = 1
)

// New creates a new Drop with sensible defaults
func New() *Drop {
	return &Drop{
		Name:  "",
		Level: 1,
		Type:  TypeConsumable,
		Att:   "",
	}
}

// Validate checks if drop has valid values
func (d *Drop) Validate() error {
	if d.Name == "" {
		return fmt.Errorf("drop name cannot be empty")
	}
	if d.Level < 1 {
		return fmt.Errorf("drop Level must be at least 1")
	}
	if d.Type < TypeConsumable {
		return fmt.Errorf("invalid drop type: %d", d.Type)
	}
	return nil
}

// CRUD operations
func (d *Drop) Delete() error {
	return database.Exec("DELETE FROM drops WHERE id = %d", d.ID)
}

func (d *Drop) Insert() error {
	id, err := database.Insert("drops", d, "ID")
	if err != nil {
		return err
	}
	d.ID = int(id)
	return nil
}

// Query functions
func Find(id int) (*Drop, error) {
	var drop Drop
	err := database.Get(&drop, "SELECT * FROM drops WHERE id = %d", id)
	if err != nil {
		return nil, fmt.Errorf("drop with ID %d not found", id)
	}
	return &drop, nil
}

func All() ([]*Drop, error) {
	var drops []*Drop
	err := database.Select(&drops, "SELECT * FROM drops ORDER BY id ASC")
	return drops, err
}

func ByLevel(minLevel int) ([]*Drop, error) {
	var drops []*Drop
	err := database.Select(&drops, "SELECT * FROM drops WHERE level <= %d ORDER BY id ASC", minLevel)
	return drops, err
}

func ByType(dropType int) ([]*Drop, error) {
	var drops []*Drop
	err := database.Select(&drops, "SELECT * FROM drops WHERE type = %d ORDER BY id ASC", dropType)
	return drops, err
}

// Helper methods
func (d *Drop) IsConsumable() bool {
	return d.Type == TypeConsumable
}

func (d *Drop) TypeName() string {
	switch d.Type {
	case TypeConsumable:
		return "Consumable"
	default:
		return "Unknown"
	}
}
