"""Controlled HTTP mapping and rollback exercise. No production or WordPress changes.
Run: python test_migration.py
It starts a temporary server on an OS-assigned localhost port and stops it afterwards.
"""
import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from threading import Thread
from urllib.request import build_opener, HTTPRedirectHandler
from urllib.error import HTTPError

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, *args): return None

class Handler(BaseHTTPRequestHandler):
    migrated = True
    mapping = {'/old-service/': '/services/technical-seo/', '/old-contact/': '/contact/'}
    def do_GET(self):
        if self.migrated and self.path in self.mapping:
            self.send_response(308); self.send_header('Location', self.mapping[self.path]); self.end_headers()
        elif self.path in (set(self.mapping.values()) if self.migrated else set(self.mapping)):
            self.send_response(200); self.send_header('Content-Type','text/plain; charset=utf-8'); self.end_headers(); self.wfile.write(b'Controlled test page')
        else: self.send_response(404); self.end_headers()
    def log_message(self, *args): pass

def run():
    server = ThreadingHTTPServer(('127.0.0.1', 0), Handler)
    worker = Thread(target=server.serve_forever, daemon=True); worker.start()
    base = 'http://127.0.0.1:'+str(server.server_port)
    opener = build_opener(NoRedirect)
    rows = []
    def expect(path, status, destination=None):
        try: response = opener.open(base+path, timeout=5)
        except HTTPError as error: response = error
        with response:
            actual = response.status
            target = response.headers.get('Location')
        assert actual == status and target == destination, (path, actual, target)
        rows.append({'phase':'migrated' if Handler.migrated else 'rolled_back','path':path,'status':actual,'location':target,'passed':True})
    try:
        for old,new in Handler.mapping.items(): expect(old,308,new); expect(new,200)
        expect('/unknown/',404)
        Handler.migrated=False
        for old,new in Handler.mapping.items(): expect(old,200); expect(new,404)
        expect('/unknown/',404)
        return {'scope':'Controlled localhost exercise. Not a client migration or production restore test.','checks':rows}
    finally: server.shutdown(); server.server_close(); worker.join()

if __name__ == '__main__': print(json.dumps(run(),indent=2))
