import { createRoute, OpenAPIHono } from '@hono/zod-openapi';
import { AuthService } from '../services';
import { UserService } from '@d8d/user-module';
import { z } from '@hono/zod-openapi';
import { AppDataSource } from '@d8d/shared-utils';
import { ErrorSchema } from '@d8d/shared-utils';
import { AuthContext } from '@d8d/shared-types';
import { UserSchema } from '@d8d/user-module';
import { parseWithAwait } from '@d8d/shared-utils';
import { RegisterSchema, TokenResponseSchema } from '../schemas';

const RegisterSchema = z.object({
  username: z.string().min(3).openapi({
    example: 'john_doe',
    description: '用户名'
  }),
  password: z.string().min(6).openapi({
    example: 'password123',
    description: '密码'
  }),
  email: z.string().email().openapi({
    example: 'john@example.com',
    description: '邮箱'
  }).optional()
});

const userService = new UserService(AppDataSource);
const authService = new AuthService(userService);

const registerRoute = createRoute({
  method: 'post',
  path: '/register',
  request: {
    body: {
      content: {
        'application/json': {
          schema: RegisterSchema
        }
      }
    }
  },
  responses: {
    201: {
      description: '注册成功',
      content: {
        'application/json': {
          schema: TokenResponseSchema
        }
      }
    },
    400: {
      description: '用户名已存在',
      content: {
        'application/json': {
          schema: ErrorSchema
        }
      }
    }
  }
});

const app = new OpenAPIHono<AuthContext>().openapi(registerRoute, async (c) => {
  const { username, password, email } = c.req.valid('json');
  const user = await userService.createUser({ username, password, email });
  const token = authService.generateToken(user);
  return c.json({
    token,
    user: await parseWithAwait(UserSchema, user)
  }, 201);
});

export default app;