// Code generated by sqlc. DO NOT EDIT.
// versions:
//   sqlc v1.27.0
// source: pricing.sql

package db

import (
	"context"

	"github.com/jackc/pgx/v5/pgtype"
	"github.com/shopspring/decimal"
)

const getPricingBaseUnit = `-- name: GetPricingBaseUnit :one
SELECT pu.id, pu.product_id, pu.unit_id, pu.conversion_factor, pu.selling_price,
       pu.min_purchase, pu.is_base, pu.is_active,
       u.name AS unit_name, COALESCE(u.symbol, '') AS unit_symbol
FROM product_units pu
JOIN units u ON u.id = pu.unit_id
WHERE pu.product_id = $1 AND pu.is_base AND pu.is_active
`

type GetPricingBaseUnitRow struct {
	ID               int64               `json:"id"`
	ProductID        int64               `json:"product_id"`
	UnitID           int64               `json:"unit_id"`
	ConversionFactor decimal.Decimal     `json:"conversion_factor"`
	SellingPrice     decimal.NullDecimal `json:"selling_price"`
	MinPurchase      decimal.Decimal     `json:"min_purchase"`
	IsBase           bool                `json:"is_base"`
	IsActive         bool                `json:"is_active"`
	UnitName         string              `json:"unit_name"`
	UnitSymbol       string              `json:"unit_symbol"`
}

func (q *Queries) GetPricingBaseUnit(ctx context.Context, productID int64) (GetPricingBaseUnitRow, error) {
	row := q.db.QueryRow(ctx, getPricingBaseUnit, productID)
	var i GetPricingBaseUnitRow
	err := row.Scan(
		&i.ID,
		&i.ProductID,
		&i.UnitID,
		&i.ConversionFactor,
		&i.SellingPrice,
		&i.MinPurchase,
		&i.IsBase,
		&i.IsActive,
		&i.UnitName,
		&i.UnitSymbol,
	)
	return i, err
}

const getPricingProduct = `-- name: GetPricingProduct :one

SELECT p.id, p.code, p.name, p.selling_price, p.unit_id, p.is_active,
       COALESCE(u.name, '') AS unit_name, COALESCE(u.symbol, '') AS unit_symbol
FROM products p
LEFT JOIN units u ON u.id = p.unit_id
WHERE p.id = $1 AND p.deleted_at IS NULL
`

type GetPricingProductRow struct {
	ID           int64           `json:"id"`
	Code         string          `json:"code"`
	Name         string          `json:"name"`
	SellingPrice decimal.Decimal `json:"selling_price"`
	UnitID       pgtype.Int8     `json:"unit_id"`
	IsActive     bool            `json:"is_active"`
	UnitName     string          `json:"unit_name"`
	UnitSymbol   string          `json:"unit_symbol"`
}

// Phase 6 item 2: inputs for the authoritative pricing engine (business-rules.md
// §11.2, §12). The engine never trusts a client-supplied price; it resolves the
// configured product-unit price, falling back to the product selling price
// scaled by the unit conversion factor.
func (q *Queries) GetPricingProduct(ctx context.Context, id int64) (GetPricingProductRow, error) {
	row := q.db.QueryRow(ctx, getPricingProduct, id)
	var i GetPricingProductRow
	err := row.Scan(
		&i.ID,
		&i.Code,
		&i.Name,
		&i.SellingPrice,
		&i.UnitID,
		&i.IsActive,
		&i.UnitName,
		&i.UnitSymbol,
	)
	return i, err
}

const getPricingProductUnit = `-- name: GetPricingProductUnit :one
SELECT pu.id, pu.product_id, pu.unit_id, pu.conversion_factor, pu.selling_price,
       pu.min_purchase, pu.is_base, pu.is_active,
       u.name AS unit_name, COALESCE(u.symbol, '') AS unit_symbol
FROM product_units pu
JOIN units u ON u.id = pu.unit_id
WHERE pu.id = $1
`

type GetPricingProductUnitRow struct {
	ID               int64               `json:"id"`
	ProductID        int64               `json:"product_id"`
	UnitID           int64               `json:"unit_id"`
	ConversionFactor decimal.Decimal     `json:"conversion_factor"`
	SellingPrice     decimal.NullDecimal `json:"selling_price"`
	MinPurchase      decimal.Decimal     `json:"min_purchase"`
	IsBase           bool                `json:"is_base"`
	IsActive         bool                `json:"is_active"`
	UnitName         string              `json:"unit_name"`
	UnitSymbol       string              `json:"unit_symbol"`
}

func (q *Queries) GetPricingProductUnit(ctx context.Context, id int64) (GetPricingProductUnitRow, error) {
	row := q.db.QueryRow(ctx, getPricingProductUnit, id)
	var i GetPricingProductUnitRow
	err := row.Scan(
		&i.ID,
		&i.ProductID,
		&i.UnitID,
		&i.ConversionFactor,
		&i.SellingPrice,
		&i.MinPurchase,
		&i.IsBase,
		&i.IsActive,
		&i.UnitName,
		&i.UnitSymbol,
	)
	return i, err
}
