import { z } from 'zod'
import { createDb } from '@znet/catalog-db'
import { baseEnv, createLogger, databaseEnv, featureEnv, loadEnv } from '@znet/shared'
import { buildApp } from './app.js'

const env = loadEnv(
  baseEnv.extend(databaseEnv.shape).extend(featureEnv.shape).extend({
    CATALOG_API_TOKEN: z.string().min(24, 'use at least 24 random characters'),
    CATALOG_API_HOST: z.string().default('127.0.0.1'),
    CATALOG_API_PORT: z.coerce.number().int().default(4100),
    MAGENTO_DEFAULT_STORE: z.string().default('default'),
  }),
)

const logger = createLogger('catalog-api', env.LOG_LEVEL)
const { db, close } = createDb(env.DATABASE_URL, { max: 10, applicationName: 'mcp-znet-catalog-api' })
const app = buildApp({ db, token: env.CATALOG_API_TOKEN, defaultStore: env.MAGENTO_DEFAULT_STORE, logger, stockEnabled: env.CATALOG_STOCK_ENABLED })

await app.listen({ host: env.CATALOG_API_HOST, port: env.CATALOG_API_PORT })

for (const signal of ['SIGTERM', 'SIGINT'] as const) {
  process.on(signal, async () => {
    await app.close()
    await close()
    process.exit(0)
  })
}
