import { Router } from 'express'
import { requireAuth, requireRole } from '../auth/authMiddleware.js'
import { AuthError } from '../auth/authService.js'
import { listRolesWithPermissions, createRole, updateRole, deleteRole, updatePermissions, updateRoleDefault, getPermTree } from './roleService.js'

const router = Router()

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

// GET /api/roles/perm-tree — 권한 트리 구조 조회
router.get('/perm-tree', async (_req, res) => {
  try {
    const tree = await getPermTree()
    res.json(tree)
  } catch (err) {
    console.error('[roles] 권한 트리 조회 오류:', err)
    res.status(500).json({ error: '권한 트리 조회 중 오류가 발생했습니다.' })
  }
})

// GET /api/roles
router.get('/', async (_req, res) => {
  try {
    const roles = await listRolesWithPermissions()
    res.json(roles)
  } catch (err) {
    console.error('[roles] 목록 조회 오류:', err)
    res.status(500).json({ error: '역할 목록 조회 중 오류가 발생했습니다.' })
  }
})

// POST /api/roles — 역할 생성
router.post('/', async (req, res) => {
  try {
    const { code, name, description } = req.body

    if (!code || !name) {
      res.status(400).json({ error: '역할 코드와 이름은 필수입니다.' })
      return
    }

    const role = await createRole({ code, name, description })
    res.status(201).json(role)
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[roles] 역할 생성 오류:', err)
    res.status(500).json({ error: '역할 생성 중 오류가 발생했습니다.' })
  }
})

// PUT /api/roles/:id — 역할 수정
router.put('/:id', async (req, res) => {
  try {
    const roleSn = Number(req.params.id)
    const { name, description } = req.body

    await updateRole(roleSn, { name, description })
    res.json({ success: true })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[roles] 역할 수정 오류:', err)
    res.status(500).json({ error: '역할 수정 중 오류가 발생했습니다.' })
  }
})

// DELETE /api/roles/:id — 역할 삭제
router.delete('/:id', async (req, res) => {
  try {
    const roleSn = Number(req.params.id)
    await deleteRole(roleSn)
    res.json({ success: true })
  } catch (err) {
    if (err instanceof AuthError) {
      res.status(err.status).json({ error: err.message })
      return
    }
    console.error('[roles] 역할 삭제 오류:', err)
    res.status(500).json({ error: '역할 삭제 중 오류가 발생했습니다.' })
  }
})

// PUT /api/roles/:id/permissions
// 요청: { permissions: [{ resourceCode, operationCode, granted }] }
router.put('/:id/permissions', async (req, res) => {
  try {
    const roleSn = Number(req.params.id)
    const { permissions } = req.body

    if (!Array.isArray(permissions)) {
      res.status(400).json({ error: '권한 목록이 필요합니다.' })
      return
    }

    for (const p of permissions) {
      if (!p.resourceCode || !p.operationCode || typeof p.granted !== 'boolean') {
        res.status(400).json({ error: '각 권한에는 resourceCode, operationCode, granted가 필요합니다.' })
        return
      }
    }

    await updatePermissions(roleSn, permissions)
    res.json({ success: true })
  } catch (err) {
    console.error('[roles] 권한 수정 오류:', err)
    res.status(500).json({ error: '권한 수정 중 오류가 발생했습니다.' })
  }
})

// PUT /api/roles/:id/default — 기본 역할 토글
router.put('/:id/default', async (req, res) => {
  try {
    const roleSn = Number(req.params.id)
    const { isDefault } = req.body

    if (typeof isDefault !== 'boolean') {
      res.status(400).json({ error: 'isDefault 값이 필요합니다.' })
      return
    }

    await updateRoleDefault(roleSn, isDefault)
    res.json({ success: true })
  } catch (err) {
    console.error('[roles] 기본 역할 변경 오류:', err)
    res.status(500).json({ error: '기본 역할 변경 중 오류가 발생했습니다.' })
  }
})

export default router
