package domain

import (
	"context"
	"time"

	"github.com/google/uuid"
)

type InvoiceStatus string

const (
	InvoiceStatusPending InvoiceStatus = "PENDING"
	InvoiceStatusDone    InvoiceStatus = "DONE"
)

type Invoice struct {
	ID               uuid.UUID     `json:"id"`
	InvoiceNumber    string        `json:"invoice_number"`
	CompanyID        uuid.UUID     `json:"company_id"`
	Status           InvoiceStatus `json:"status"`
	SubtotalAmount   float64       `json:"subtotal_amount"`
	TaxAmount        float64       `json:"tax_amount"`
	GrandTotalAmount float64       `json:"grand_total_amount"`
	CreatedAt        time.Time     `json:"created_at"`
	UpdatedAt        time.Time     `json:"updated_at"`
	DeletedAt        *time.Time    `json:"deleted_at,omitempty"`
	Items            []InvoiceItem `json:"items,omitempty"`
}

type InvoiceItem struct {
	ID          uuid.UUID  `json:"id"`
	InvoiceID   uuid.UUID  `json:"invoice_id"`
	Description string     `json:"description"`
	Amount      float64    `json:"amount"`
	CreatedAt   time.Time  `json:"created_at"`
	UpdatedAt   time.Time  `json:"updated_at"`
	DeletedAt   *time.Time `json:"deleted_at,omitempty"`
}

type InvoiceRepository interface {
	Create(ctx context.Context, invoice *Invoice) error
	GetByID(ctx context.Context, id uuid.UUID) (*Invoice, error)
	ListByCompany(ctx context.Context, companyID uuid.UUID) ([]Invoice, error)
	UpdateStatus(ctx context.Context, id uuid.UUID, status InvoiceStatus) error
	Delete(ctx context.Context, id uuid.UUID) error

	CreateItem(ctx context.Context, item *InvoiceItem) error
	GetItemsByInvoiceID(ctx context.Context, invoiceID uuid.UUID) ([]InvoiceItem, error)
}

type InvoiceUsecase interface {
	CreateInvoice(ctx context.Context, invoice *Invoice) error
	GetInvoice(ctx context.Context, id uuid.UUID) (*Invoice, error)
	GetCompanyInvoices(ctx context.Context, companyID uuid.UUID) ([]Invoice, error)
	MarkAsPaid(ctx context.Context, id uuid.UUID) error
}
