import 'reflect-metadata'
import { Hono } from 'hono';
import { hc } from 'hono/client';
import { cors } from 'hono/cors';
import { logger } from 'hono/logger';
import { validateAuthSession, verifyOrigin } from './middleware/auth.middleware';
import { config } from './common/config';
import { container } from 'tsyringe';
import { IamController } from './controllers/iam.controller';
import { LoginController } from './controllers/login.controller';
import {UserController} from "$lib/server/api/controllers/user.controller";
import {SignupController} from "$lib/server/api/controllers/signup.controller";

/* ----------------------------------- Api ---------------------------------- */
const app = new Hono().basePath('/api');

/* --------------------------- Global Middlewares --------------------------- */
app.use(verifyOrigin).use(validateAuthSession);
app.use(logger());

app.use(
	'/*',
	cors({
		origin: [
			'http://localhost:5173',
			'http://localhost:80',
			'http://host.docker.internal:80',
			'http://host.docker.internal:5173'
		], // Replace with your allowed domains

		allowMethods: ['POST'],
		allowHeaders: ['Content-Type']
		// credentials: true, // If you need to send cookies or HTTP authentication
	})
);

/* --------------------------------- Routes --------------------------------- */
const routes = app
		.route('/me', container.resolve(IamController).routes())
		.route('/user', container.resolve(UserController).routes())
		.route('/login', container.resolve(LoginController).routes())
		.route('/signup', container.resolve(SignupController).routes())
		.get('/', (c) => c.json({ message: 'Server is healthy' }));

/* -------------------------------------------------------------------------- */
/*                                   Exports                                  */
/* -------------------------------------------------------------------------- */
export type AppType = typeof routes;

export const rpc = hc<AppType>(config.ORIGIN);
export type ApiClient = typeof rpc;
export type ApiRoutes = typeof routes;
export { app };