import type { Request, Response, RequestHandler } from 'express';
import { injectable, container } from 'tsyringe';
import type { RequestWithUser } from '@interfaces/auth.interface';
import type { UserCreateData } from '@entities/user.entity';
import { asyncHandler } from '@utils/asyncHandler';
import { AuthService } from '@services/auth.service';

@injectable()
export class AuthController {
  private readonly authService: AuthService;

  constructor() {
    this.authService = container.resolve(AuthService);
  }

  public signUp: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
    const userData: UserCreateData = req.body;
    const signUpUserData = await this.authService.signup(userData);

    res.status(201).json({ data: signUpUserData.toResponse(), message: 'signup' });
  });

  public logIn: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
    const loginData: { email: string; password: string } = req.body;
    const { cookie, user } = await this.authService.login(loginData);

    res.setHeader('Set-Cookie', [cookie]);
    res.status(200).json({ data: user.toResponse(), message: 'login' });
  });

  public logOut: RequestHandler = asyncHandler(async (req: Request, res: Response) => {
    const userReq = req as RequestWithUser;
    const user = userReq.user;
    await this.authService.logout(user);

    res.clearCookie('Authorization', {
      httpOnly: true,
      path: '/',
      sameSite: 'lax',
      // secure: true, // 프로덕션에서 HTTPS일 때만
    });
    res.status(200).json({ message: 'logout' });
  });
}
