import { Router } from 'express'
import { login, getUserInfo, AuthError } from './authService.js'
import { googleLogin } from './oauthService.js'
import { clearTokenCookie } from './jwtProvider.js'
import { requireAuth } from './authMiddleware.js'

const router = Router()

// POST /api/auth/login
router.post('/login', async (req, res) => {
  try {
    const { account, password } = req.body

    if (!account || !password) {
      res.status(400).json({ error: '아이디와 비밀번호를 입력해주세요.' })
      return
    }

    const ipAddr = (req.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim() || req.ip || ''
    const userAgent = req.headers['user-agent'] || ''

    const userInfo = await login(account, password, ipAddr, userAgent, res)

    res.json({ success: true, user: userInfo })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[auth] 로그인 오류:', err)
    res.status(500).json({ error: '로그인 처리 중 오류가 발생했습니다.' })
  }
})

// POST /api/auth/oauth/google
router.post('/oauth/google', async (req, res) => {
  try {
    const { credential } = req.body

    if (!credential) {
      res.status(400).json({ error: 'Google 인증 토큰이 필요합니다.' })
      return
    }

    const ipAddr = (req.headers['x-forwarded-for'] as string)?.split(',')[0]?.trim() || req.ip || ''
    const userAgent = req.headers['user-agent'] || ''

    const result = await googleLogin(credential, ipAddr, userAgent, res)

    if (result.type === 'pending') {
      res.json({ success: true, pending: true, message: result.message })
      return
    }

    res.json({ success: true, user: result.user })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[auth] Google OAuth 오류:', err)
    res.status(500).json({ error: 'Google 로그인 처리 중 오류가 발생했습니다.' })
  }
})

// POST /api/auth/logout
router.post('/logout', requireAuth, (_req, res) => {
  clearTokenCookie(res)
  res.json({ success: true })
})

// GET /api/auth/me
router.get('/me', requireAuth, async (req, res) => {
  try {
    const userInfo = await getUserInfo(req.user!.sub)
    res.json(userInfo)
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[auth] 사용자 정보 조회 오류:', err)
    res.status(500).json({ error: '사용자 정보 조회 중 오류가 발생했습니다.' })
  }
})

export default router
