#!/usr/bin/env python3
"""Minimal HTTP server with Range support for single file download."""

import http.server
import socketserver
import os
import sys

FILE_TO_SERVE = "gemma4_ayurveda_final_combined.jsonl"
HOST = "0.0.0.0"
PORT = 8765

class RangeHandler(http.server.SimpleHTTPRequestHandler):
    def do_GET(self):
        if self.path != "/" + FILE_TO_SERVE:
            self.send_error(404, "Only %s is available" % FILE_TO_SERVE)
            return

        filepath = os.path.join(os.getcwd(), FILE_TO_SERVE)
        if not os.path.exists(filepath):
            self.send_error(404, "File not found")
            return

        file_size = os.path.getsize(filepath)
        range_header = self.headers.get('Range')

        if range_header:
            try:
                # bytes=start-end
                byte_range = range_header.strip().split('=')[1]
                start, end = byte_range.split('-')
                start = int(start) if start else 0
                end = int(end) if end else file_size - 1
            except Exception:
                start = 0
                end = file_size - 1

            self.send_response(206)
            self.send_header('Content-Type', 'application/octet-stream')
            self.send_header('Accept-Ranges', 'bytes')
            self.send_header('Content-Length', str(end - start + 1))
            self.send_header('Content-Range', 'bytes %d-%d/%d' % (start, end, file_size))
            self.send_header('Content-Disposition', 'attachment; filename="%s"' % FILE_TO_SERVE)
            self.end_headers()

            with open(filepath, 'rb') as f:
                f.seek(start)
                remaining = end - start + 1
                while remaining > 0:
                    chunk_size = min(65536, remaining)
                    data = f.read(chunk_size)
                    if not data:
                        break
                    self.wfile.write(data)
                    remaining -= len(data)
        else:
            self.send_response(200)
            self.send_header('Content-Type', 'application/octet-stream')
            self.send_header('Accept-Ranges', 'bytes')
            self.send_header('Content-Length', str(file_size))
            self.send_header('Content-Disposition', 'attachment; filename="%s"' % FILE_TO_SERVE)
            self.end_headers()

            with open(filepath, 'rb') as f:
                while True:
                    data = f.read(65536)
                    if not data:
                        break
                    self.wfile.write(data)

    def log_message(self, format, *args):
        print(format % args)

if __name__ == '__main__':
    with socketserver.TCPServer((HOST, PORT), RangeHandler) as httpd:
        print("Serving %s on http://%s:%d" % (FILE_TO_SERVE, HOST, PORT))
        print("Supports resume (Range requests)")
        httpd.serve_forever()
