import { Router } from 'express';
import { requireAuth } from '../auth/authMiddleware.js';
import { listOrganizations, getOrganization, listUploadLogs, listInsurance, listNearbyOrganizations } from './assetsService.js';

const router = Router();

// ============================================================
// GET /api/assets/orgs — 기관 목록
// ============================================================
router.get('/orgs', requireAuth, async (req, res) => {
  try {
    const { orgTp, jrsd, search } = req.query as {
      orgTp?: string;
      jrsd?: string;
      search?: string;
    };
    const orgs = await listOrganizations({ orgTp, jrsd, search });
    res.json(orgs);
  } catch (err) {
    console.error('[assets] 기관 목록 조회 오류:', err);
    res.status(500).json({ error: '기관 목록 조회 중 오류가 발생했습니다.' });
  }
});

// ============================================================
// GET /api/assets/orgs/nearby — 근처 기관 목록 (PostGIS 반경 검색)
// ============================================================
router.get('/orgs/nearby', requireAuth, async (req, res) => {
  try {
    const lat = parseFloat(req.query.lat as string);
    const lng = parseFloat(req.query.lng as string);
    const radius = parseFloat(req.query.radius as string);
    if (isNaN(lat) || isNaN(lng) || isNaN(radius) || radius <= 0) {
      res.status(400).json({ error: '유효하지 않은 좌표 또는 반경입니다.' });
      return;
    }
    const orgs = await listNearbyOrganizations(lat, lng, radius);
    res.json(orgs);
  } catch (err) {
    console.error('[assets] 근처 기관 조회 오류:', err);
    res.status(500).json({ error: '근처 기관 조회 중 오류가 발생했습니다.' });
  }
});

// ============================================================
// GET /api/assets/orgs/:sn — 기관 상세 (장비 + 담당자)
// ============================================================
router.get('/orgs/:sn', requireAuth, async (req, res) => {
  try {
    const sn = parseInt(req.params.sn as string, 10);
    if (isNaN(sn)) {
      res.status(400).json({ error: '유효하지 않은 기관 번호입니다.' });
      return;
    }
    const org = await getOrganization(sn);
    if (!org) {
      res.status(404).json({ error: '기관을 찾을 수 없습니다.' });
      return;
    }
    res.json(org);
  } catch (err) {
    console.error('[assets] 기관 상세 조회 오류:', err);
    res.status(500).json({ error: '기관 상세 조회 중 오류가 발생했습니다.' });
  }
});

// ============================================================
// GET /api/assets/insurance — 선박보험(유류오염보장계약) 목록
// ============================================================
router.get('/insurance', requireAuth, async (req, res) => {
  try {
    const { search, shipTp, issueOrg, insurer, page, limit } = req.query as {
      search?: string;
      shipTp?: string;
      issueOrg?: string;
      insurer?: string;
      page?: string;
      limit?: string;
    };
    const data = await listInsurance({
      search,
      shipTp,
      issueOrg,
      insurer,
      page: page ? parseInt(page, 10) : undefined,
      limit: limit ? parseInt(limit, 10) : undefined,
    });
    res.json(data);
  } catch (err) {
    console.error('[assets] 선박보험 조회 오류:', err);
    res.status(500).json({ error: '선박보험 조회 중 오류가 발생했습니다.' });
  }
});

// ============================================================
// GET /api/assets/upload-logs — 업로드 이력
// ============================================================
router.get('/upload-logs', requireAuth, async (req, res) => {
  try {
    const limit = Math.min(parseInt(req.query.limit as string, 10) || 20, 100);
    const logs = await listUploadLogs(limit);
    res.json(logs);
  } catch (err) {
    console.error('[assets] 업로드 이력 조회 오류:', err);
    res.status(500).json({ error: '업로드 이력 조회 중 오류가 발생했습니다.' });
  }
});

export default router;
