import { Hono } from 'hono';
import { logger } from 'hono/logger';
import { contextStorage, getContext } from 'hono/context-storage';
import { prettyJSON } from 'hono/pretty-json';
import { cors } from 'hono/cors';

import { trpcServer } from '@hono/trpc-server';
import Redis from 'ioredis';
import redis from './redis';
import minioClient from './minio';
import { Client } from 'minio';

import { appRouter } from './trpc';
import { wsHandler, wsConfig } from './socket';

// 导入新的路由
import userRest from './user/user.rest';
// 使用新的 @repo/storage 包
import { createStorageApp, startCleanupScheduler, adapterRegistry } from '@repo/storage';
// 导入 Prisma 适配器实现
import { PrismaDatabaseAdapter } from './adapters/storage-adapter';

// 注册数据库适配器
adapterRegistry.setDatabaseAdapter(new PrismaDatabaseAdapter());

type Env = {
	Variables: {
		redis: Redis;
		minio: Client;
	};
};

const app = new Hono<Env>();

app.use(
	'*',
	cors({
		origin: 'http://localhost:3001',
		credentials: true,
	}),
);

app.use('*', async (c, next) => {
	c.set('redis', redis);
	c.set('minio', minioClient);
	await next();
});
app.use('*', async (c, next) => {
	c.set('redis', redis);
	await next();
});
app.use(contextStorage());
app.use(prettyJSON()); // With options: prettyJSON({ space: 4 })
app.use(logger());
app.use(
	'/trpc/*',
	trpcServer({
		router: appRouter,
	}),
);

// 添加 REST API 路由
app.route('/api/users', userRest);

// 使用新的存储应用，包含API和上传功能
const storageApp = createStorageApp({
	apiBasePath: '/api/storage',
	uploadPath: '/upload',
});
app.route('/', storageApp);

// 添加 WebSocket 路由
app.get('/ws', wsHandler);

// 启动上传清理定时任务
startCleanupScheduler();

const bunServerConfig = {
	port: 3000,
	fetch: app.fetch,
	...wsConfig,
};
// 启动 Bun 服务器
Bun.serve(bunServerConfig);
export default app;
