#!/usr/bin/env python3
"""Read-only socket preflight, then invoke mongosh on an existing MongoDB 7 service."""
import argparse
import json
import os
from pathlib import Path
import shutil
import socket
import subprocess
import sys
import urllib.parse
import uuid


def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument('--uri', default='mongodb://127.0.0.1:17017/?directConnection=true')
    parser.add_argument('--server-version', default='7.0.14',
                        help='exact expected runtime version (7.x); source baseline remains 7.0.14')
    parser.add_argument('--standalone', action='store_true',
                        help='only query/index/CAS/local concern checks; skip replica-set-only experiments')
    args = parser.parse_args()
    uri = urllib.parse.urlsplit(args.uri)
    if (uri.scheme != 'mongodb' or uri.hostname not in ('127.0.0.1', 'localhost', '::1')
            or uri.username or uri.password or uri.path not in ('', '/') or ',' in uri.netloc or uri.fragment):
        parser.error('--uri must address one loopback MongoDB without credentials or a database path')
    try:
        with socket.create_connection((uri.hostname, uri.port or 27017), timeout=3):
            pass
        executable = shutil.which('mongosh')
        if not executable:
            raise RuntimeError('TCP connected, but mongosh is not on PATH; no database was created')
        folder = Path(__file__).resolve().parent
        env = {**os.environ, 'T18_MONGO_URI': args.uri,
               'T18_MONGO_SERVER_VERSION': args.server_version,
               'T18_MONGO_STANDALONE': '1' if args.standalone else '0',
               'T18_MONGO_DB': 'study_t18_mongo_' + uuid.uuid4().hex,
               'T18_MONGO_FIXTURE': str(folder / 'fixture.json')}
        return subprocess.run([executable, '--nodb', '--quiet', '--file', str(folder / 'verify.js')],
                              env=env, check=False).returncode
    except Exception as exc:
        print(json.dumps({'kind': 'service-run', 'status': 'failed', 'checks': [], 'created_database': False,
                          'error': f'{type(exc).__name__}: {exc}'}, ensure_ascii=False, indent=2))
        return 1


if __name__ == '__main__':
    sys.exit(main())
