import { Router } from 'express'
import { requireAuth, requireRole } from '../auth/authMiddleware.js'
import {
  listMapBase,
  getActiveMapTypes,
  createMapBase,
  updateMapBase,
  deleteMapBase,
} from './mapBaseService.js'

const router = Router()

// GET /api/map-base/active — 활성 지도 목록 (전체 사용자)
router.get('/active', requireAuth, async (_req, res) => {
  try {
    const types = await getActiveMapTypes()
    res.json(types)
  } catch (err) {
    console.error('[map-base] 활성 목록 조회 오류:', err)
    res.status(500).json({ error: '지도 목록 조회 중 오류가 발생했습니다.' })
  }
})

// GET /api/map-base — 전체 목록 (관리자)
router.get('/', requireAuth, requireRole('ADMIN'), async (req, res) => {
  try {
    const page = parseInt(req.query.page as string, 10) || 1
    const limit = Math.min(parseInt(req.query.limit as string, 10) || 20, 100)
    const result = await listMapBase(page, limit)
    res.json(result)
  } catch (err) {
    console.error('[map-base] 목록 조회 오류:', err)
    res.status(500).json({ error: '지도 목록 조회 중 오류가 발생했습니다.' })
  }
})

// POST /api/map-base — 등록 (관리자)
router.post('/', requireAuth, requireRole('ADMIN'), async (req, res) => {
  try {
    const { mapKey, mapNm, mapLevelCd, mapSrc, mapDc, useYn } = req.body as {
      mapKey?: string;
      mapNm?: string;
      mapLevelCd?: string;
      mapSrc?: string;
      mapDc?: string;
      useYn?: string;
    }
    if (!mapKey || !mapNm) {
      res.status(400).json({ error: '지도 키와 이름은 필수입니다.' })
      return
    }
    const created = await createMapBase({
      mapKey,
      mapNm,
      mapLevelCd,
      mapSrc,
      mapDc,
      useYn,
      regId: req.user?.sub,
      regNm: req.user?.name,
    })
    res.json(created)
  } catch (err) {
    console.error('[map-base] 등록 오류:', err)
    res.status(500).json({ error: '지도 등록 중 오류가 발생했습니다.' })
  }
})

// POST /api/map-base/update — 수정 (관리자)
router.post('/update', requireAuth, requireRole('ADMIN'), async (req, res) => {
  try {
    const { mapSn, mapKey, mapNm, mapLevelCd, mapSrc, mapDc, useYn } = req.body as {
      mapSn?: number;
      mapKey?: string;
      mapNm?: string;
      mapLevelCd?: string | null;
      mapSrc?: string | null;
      mapDc?: string | null;
      useYn?: string;
    }
    if (!mapSn) {
      res.status(400).json({ error: '지도 번호가 필요합니다.' })
      return
    }
    const updated = await updateMapBase(Number(mapSn), { mapKey, mapNm, mapLevelCd, mapSrc, mapDc, useYn })
    if (!updated) {
      res.status(404).json({ error: '지도를 찾을 수 없습니다.' })
      return
    }
    res.json(updated)
  } catch (err) {
    console.error('[map-base] 수정 오류:', err)
    res.status(500).json({ error: '지도 수정 중 오류가 발생했습니다.' })
  }
})

// POST /api/map-base/delete — 삭제 (관리자, soft-delete)
router.post('/delete', requireAuth, requireRole('ADMIN'), async (req, res) => {
  try {
    const { mapSn } = req.body as { mapSn?: number }
    if (!mapSn) {
      res.status(400).json({ error: '지도 번호가 필요합니다.' })
      return
    }
    const ok = await deleteMapBase(Number(mapSn))
    if (!ok) {
      res.status(404).json({ error: '지도를 찾을 수 없습니다.' })
      return
    }
    res.json({ success: true })
  } catch (err) {
    console.error('[map-base] 삭제 오류:', err)
    res.status(500).json({ error: '지도 삭제 중 오류가 발생했습니다.' })
  }
})

export default router
