import { Router } from 'express'
import { requireAuth, requireRole } from '../auth/authMiddleware.js'
import { AuthError } from '../auth/authService.js'
import {
  listUsers,
  getUser,
  createUser,
  updateUser,
  changePassword,
  assignRoles,
  approveUser,
  rejectUser,
  listOrgs,
} from './userService.js'

const router = Router()

router.use(requireAuth)
router.use(requireRole('ADMIN'))

// GET /api/users
router.get('/', async (req, res) => {
  try {
    const search = req.query.search as string | undefined
    const status = req.query.status as string | undefined
    const users = await listUsers(search, status)
    res.json(users)
  } catch (err) {
    console.error('[users] 목록 조회 오류:', err)
    res.status(500).json({ error: '사용자 목록 조회 중 오류가 발생했습니다.' })
  }
})

// GET /api/users/orgs — 조직 목록 (/:id 보다 앞에 등록해야 함)
router.get('/orgs', async (_req, res) => {
  try {
    const orgs = await listOrgs()
    res.json(orgs)
  } catch (err) {
    console.error('[users] 조직 목록 오류:', err)
    res.status(500).json({ error: '조직 목록 조회 중 오류가 발생했습니다.' })
  }
})

// GET /api/users/:id
router.get('/:id', async (req, res) => {
  try {
    const user = await getUser(req.params.id)
    res.json(user)
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[users] 상세 조회 오류:', err)
    res.status(500).json({ error: '사용자 조회 중 오류가 발생했습니다.' })
  }
})

// POST /api/users
router.post('/', async (req, res) => {
  try {
    const { account, password, name, rank, orgSn, roleSns } = req.body

    if (!account || !password || !name) {
      res.status(400).json({ error: '계정, 비밀번호, 이름은 필수입니다.' })
      return
    }

    const result = await createUser({ account, password, name, rank, orgSn, roleSns })
    res.status(201).json(result)
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[users] 생성 오류:', err)
    res.status(500).json({ error: '사용자 생성 중 오류가 발생했습니다.' })
  }
})

// PUT /api/users/:id
router.put('/:id', async (req, res) => {
  try {
    const { name, rank, orgSn, status } = req.body
    await updateUser(req.params.id, { name, rank, orgSn, status })
    res.json({ success: true })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[users] 수정 오류:', err)
    res.status(500).json({ error: '사용자 수정 중 오류가 발생했습니다.' })
  }
})

// PUT /api/users/:id/password
router.put('/:id/password', async (req, res) => {
  try {
    const { password } = req.body
    if (!password || password.length < 4) {
      res.status(400).json({ error: '비밀번호는 4자 이상이어야 합니다.' })
      return
    }
    await changePassword(req.params.id, password)
    res.json({ success: true })
  } catch (err) {
    console.error('[users] 비밀번호 변경 오류:', err)
    res.status(500).json({ error: '비밀번호 변경 중 오류가 발생했습니다.' })
  }
})

// PUT /api/users/:id/approve — 사용자 승인
router.put('/:id/approve', async (req, res) => {
  try {
    await approveUser(req.params.id)
    res.json({ success: true })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[users] 승인 오류:', err)
    res.status(500).json({ error: '사용자 승인 중 오류가 발생했습니다.' })
  }
})

// PUT /api/users/:id/reject — 사용자 거절
router.put('/:id/reject', async (req, res) => {
  try {
    await rejectUser(req.params.id)
    res.json({ success: true })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[users] 거절 오류:', err)
    res.status(500).json({ error: '사용자 거절 중 오류가 발생했습니다.' })
  }
})

// PUT /api/users/:id/roles
router.put('/:id/roles', async (req, res) => {
  try {
    const { roleSns } = req.body
    if (!Array.isArray(roleSns)) {
      res.status(400).json({ error: '역할 목록이 필요합니다.' })
      return
    }
    await assignRoles(req.params.id, roleSns)
    res.json({ success: true })
  } catch (err) {
    console.error('[users] 역할 할당 오류:', err)
    res.status(500).json({ error: '역할 할당 중 오류가 발생했습니다.' })
  }
})

export default router
