# Snipe works out of the box with the scraper (no credentials needed).
# Set eBay API credentials to unlock full trust scores —
# account age and category history signals require the eBay Browse API.
# Without credentials the app logs a warning and falls back to the scraper.

# ── eBay Developer Keys — Production ──────────────────────────────────────────
# From https://developer.ebay.com/my/keys (Production tab)
EBAY_APP_ID=
EBAY_DEV_ID=
EBAY_CERT_ID=

# ── eBay Developer Keys — Sandbox ─────────────────────────────────────────────
# From https://developer.ebay.com/my/keys (Sandbox tab)
EBAY_SANDBOX_APP_ID=
EBAY_SANDBOX_DEV_ID=
EBAY_SANDBOX_CERT_ID=

# ── Active environment ─────────────────────────────────────────────────────────
# production | sandbox
EBAY_ENV=production

# ── eBay OAuth — Authorization Code (user account connection) ─────────────────
# Enables paid-tier users to connect their personal eBay account for instant
# trust scoring via Trading API GetUser (account age + per-category feedback).
# Without this, Snipe falls back to Shopping API + Playwright scraping.
#
# Setup steps:
#   1. Go to https://developer.ebay.com/my/keys → select your Production app
#   2. Under "Auth Accepted URL / RuName", create a new entry:
#      - Callback URL: https://your-domain/api/ebay/callback
#        (e.g. https://menagerie.circuitforge.tech/snipe/api/ebay/callback)
#      - Snipe generates the redirect automatically — just register the URL above
#   3. Copy the RuName value (looks like "YourName-AppName-PRD-xxx-yyy")
#      and paste it as EBAY_RUNAME below.
#   4. Set EBAY_OAUTH_REDIRECT_URI to the same HTTPS callback URL.
#
# Self-hosted: your callback URL must be HTTPS and publicly reachable.
# EBAY_RUNAME=YourName-AppName-PRD-xxxxxxxx-xxxxxxxx
# EBAY_OAUTH_REDIRECT_URI=https://your-domain/api/ebay/callback

# ── eBay Account Deletion Webhook ──────────────────────────────────────────────
# Register endpoint at https://developer.ebay.com/my/notification — required for
# production key activation. Set EBAY_NOTIFICATION_ENDPOINT to the public HTTPS
# URL eBay will POST to (e.g. https://snipe.circuitforge.tech/api/ebay/account-deletion).
EBAY_NOTIFICATION_TOKEN=
EBAY_NOTIFICATION_ENDPOINT=
# Set to false during sandbox/registration (no production token available yet).
# Set to true once production credentials are active — enforces ECDSA verification.
EBAY_WEBHOOK_VERIFY_SIGNATURES=true

# ── Database ───────────────────────────────────────────────────────────────────
SNIPE_DB=data/snipe.db

# Product identifier reported in cf-orch coordinator analytics for per-app breakdown
CF_APP_NAME=snipe

# ── Cloud mode (managed / menagerie instance only) ─────────────────────────────
# Leave unset for self-hosted / local use. When set, per-user DB isolation
# and Heimdall licensing are enabled. compose.cloud.yml sets CLOUD_MODE=true
# automatically — only set manually if running without Docker.

# CLOUD_MODE=true
# CLOUD_DATA_ROOT=/devl/snipe-cloud-data

# JWT secret from cf-directus (must match Directus SECRET env var exactly).
# DIRECTUS_JWT_SECRET=

# Heimdall license server — for tier resolution and free-key auto-provisioning.
# HEIMDALL_URL=https://license.circuitforge.tech
# HEIMDALL_ADMIN_TOKEN=

# ── eBay Affiliate (optional) ─────────────────────────────────────────────────
# Set to your eBay Partner Network (EPN) campaign ID to earn commissions on
# listing click-throughs. Leave blank for clean /itm/ URLs (no tracking).
# Register at https://partnernetwork.ebay.com — self-hosted users can use their
# own ID; the CF cloud instance uses CF's campaign ID (disclosed in the UI).
# EBAY_AFFILIATE_CAMPAIGN_ID=

# ── LLM inference (Search with AI / photo analysis) ──────────────────────────
# For self-hosted use, create config/llm.yaml from config/llm.yaml.example.
# config/llm.yaml is the preferred way to configure backends (supports cf-orch,
# multiple fallback backends, per-backend model selection).
#
# As a quick alternative, circuitforge-core LLMRouter also auto-detects backends
# from these env vars when no llm.yaml is present:
#   1. ANTHROPIC_API_KEY   → Claude API (cloud; requires Paid tier key)
#   2. OPENAI_API_KEY      → OpenAI-compatible endpoint
#   3. OLLAMA_HOST         → local Ollama (default: http://localhost:11434)
# Leave all unset to disable LLM features (Search with AI won't be available).

# ANTHROPIC_API_KEY=
# ANTHROPIC_MODEL=claude-haiku-4-5-20251001

# OPENAI_API_KEY=
# OPENAI_BASE_URL=https://api.openai.com/v1
# OPENAI_MODEL=gpt-4o-mini

# OLLAMA_HOST=http://localhost:11434
# OLLAMA_MODEL=llava:7b

# GPU Server — routes vision/LLM tasks to a cf-orch coordinator for VRAM management.
# Self-hosted: point at a local cf-orch coordinator if you have one running.
# Cloud (internal): managed coordinator at orch.circuitforge.tech.
# Leave unset to run vision tasks inline (no VRAM coordination).
# GPU_SERVER_URL=http://10.1.10.71:7700
#
# CF_ORCH_URL is accepted as a backward-compat alias for GPU_SERVER_URL.
#
# cf-orch agent (compose --profile orch) — coordinator URL for the sidecar agent.
# Defaults to GPU_SERVER_URL if unset.
# CF_ORCH_COORDINATOR_URL=http://10.1.10.71:7700

# ── Shared Postgres (optional — strongly recommended for cloud/multi-user) ────
# When set, sellers, market_comps, reported_sellers, and scammer_blocklist are
# stored in Postgres instead of SQLite. Required to avoid database-locked errors
# under concurrent load (>10 simultaneous search users).
# Cloud instances: set to the cf-postgres DSN. Self-hosted: leave unset for SQLite.
# SNIPE_SHARED_DB_URL=postgresql://snipe:<password>@localhost:5432/snipe_shared

# ── Community DB (optional) ──────────────────────────────────────────────────
# When set, seller trust signals (confirmed scammers added to blocklist) are
# published to the shared community PostgreSQL for cross-user signal aggregation.
# Managed instances: set automatically by cf-orch. Self-hosted: leave unset.
# Requires cf-community-postgres container (cf-orch compose stack).
# COMMUNITY_DB_URL=postgresql://cf_community:<password>@localhost:5432/cf_community

# ── In-app feedback (beta) ────────────────────────────────────────────────────
# When set, a feedback FAB appears in the UI and routes submissions to Forgejo.
# Leave unset to silently hide the button (demo/offline deployments).
# FORGEJO_API_TOKEN=             # dev/admin token
# FORGEJO_BOT_TOKEN=             # cf-bugbot token — used for in-app feedback; falls back to FORGEJO_API_TOKEN
# FORGEJO_REPO=Circuit-Forge/snipe
# FORGEJO_API_URL=https://git.opensourcesolarpunk.com/api/v1
