"""실제 배포 주소의 읽기 전용 확인: python tools/smoke_test.py https://..."""
import json
import ssl
import sys
import time
import urllib.error
import urllib.request
from pathlib import Path

base = (sys.argv[1] if len(sys.argv) > 1 else 'http://127.0.0.1:5000').rstrip('/')
checks = []


def request(path, payload=None, expected=200):
    data = None if payload is None else json.dumps(payload, ensure_ascii=False).encode()
    req = urllib.request.Request(base + path, data=data, headers={'Content-Type': 'application/json', 'User-Agent': 'SejongAppSmokeTest/1.0'})
    start = time.perf_counter()
    try:
        response = urllib.request.urlopen(req, timeout=30, context=ssl.create_default_context())
    except urllib.error.HTTPError as error:
        response = error
    with response:
        body = response.read()
        assert response.code == expected, (path, response.code, body[:200])
        checks.append({'path': path, 'status': response.code, 'ms': round((time.perf_counter() - start) * 1000)})
        return body, response.headers


page, headers = request('/')
assert '세종 창업 입지 도우미'.encode() in page
assert "object-src 'none'" in headers.get('Content-Security-Policy', '')
health = json.loads(request('/healthz')[0])
assert health['status'] == 'ok' and health['rows'] == 15816 and health['model_count'] == 57
metadata = json.loads(request('/api/meta')[0])
assert metadata['데이터점검']['2025-06']['사용행'] == 14853
assert metadata['검증통과업종수'] == 10
assert len(json.loads(request('/api/boundary')[0])['features']) == 24
payload = {'lat': 36.504889, 'lon': 127.262486, 'mid': '비알코올'}
analysis = json.loads(request('/api/analyze', payload)[0])
assert analysis['현황']['업소수'] == 40 and analysis['현황']['같은업종수'] == 3
assert analysis['현황']['작년업소수'] == 39 and analysis['동'] == '어진동'
assert abs(analysis['참고']['예상'] - 3.5) < 0.01
assert analysis['참고']['검증비율'] == 1
comparison = json.loads(request('/api/recommend', payload)[0])
assert comparison['상태'] in {'비교가능', '표시대상없음'}
request('/api/analyze', {**payload, 'mid': []}, 400)
request('/api/analyze', {**payload, 'lat': 0}, 400)
request('/api/analyze', {'lat': True, 'lon': 127.2, 'mid': '한식'}, 400)
request('/api/analyze', {**payload, 'mid': 'x' * 20000}, 413)
request('/missing', expected=404)
for resource in ('app.js', 'app.css', 'vendor/leaflet/leaflet.js', 'vendor/leaflet/leaflet.css'):
    request('/static/' + resource)
result = {'base': base, 'health': health, 'passed_models': metadata['검증통과업종수'], 'example': {'stores': analysis['현황']['업소수'], 'same_category': analysis['현황']['같은업종수'], 'reference': analysis['참고']['예상']}, 'checks': checks}
if len(sys.argv) > 2:
    Path(sys.argv[2]).write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8')
print(json.dumps(result, ensure_ascii=False, indent=2))
