import http.server
import socketserver
import sys
import os
import urllib.parse

class CORSRequestHandler(http.server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Access-Control-Allow-Methods', 'GET, OPTIONS')
        self.send_header('Access-Control-Allow-Headers', '*')
        self.send_header('Access-Control-Expose-Headers', 'Content-Length, Content-Range')
        self.send_header('Cache-Control', 'public, max-age=31536000')
        return super(CORSRequestHandler, self).end_headers()

    def do_OPTIONS(self):
        self.send_response(204)
        self.end_headers()

    def do_GET(self):
        """Serve static files with full Range request support for audio seeking."""
        parsed_path = urllib.parse.urlparse(self.path)
        filepath = urllib.parse.unquote(parsed_path.path).lstrip('/')
        
        if filepath.endswith('.wav') and os.path.exists(filepath):
            try:
                f = open(filepath, 'rb')
                file_len = os.fstat(f.fileno()).st_size
                
                if 'Range' in self.headers:
                    range_header = self.headers['Range']
                    range_match = range_header.replace('bytes=', '').split('-')
                    first_byte = int(range_match[0]) if range_match[0] else 0
                    last_byte = int(range_match[1]) if len(range_match) > 1 and range_match[1] else file_len - 1
                    if last_byte >= file_len:
                        last_byte = file_len - 1
                    length = last_byte - first_byte + 1
                    
                    self.send_response(206)
                    self.send_header('Content-Type', 'audio/wav')
                    self.send_header('Accept-Ranges', 'bytes')
                    self.send_header('Content-Range', f'bytes {first_byte}-{last_byte}/{file_len}')
                    self.send_header('Content-Length', str(length))
                    self.end_headers()
                    
                    f.seek(first_byte)
                    remaining = length
                    while remaining > 0:
                        chunk = f.read(min(remaining, 64 * 1024))
                        if not chunk:
                            break
                        try:
                            self.wfile.write(chunk)
                        except BrokenPipeError:
                            break
                        remaining -= len(chunk)
                else:
                    self.send_response(200)
                    self.send_header('Content-Type', 'audio/wav')
                    self.send_header('Accept-Ranges', 'bytes')
                    self.send_header('Content-Length', str(file_len))
                    self.end_headers()
                    try:
                        while True:
                            chunk = f.read(64 * 1024)
                            if not chunk:
                                break
                            self.wfile.write(chunk)
                    except BrokenPipeError:
                        pass
                
                f.close()
                return
            except Exception as e:
                print(f"Error serving file: {e}")
        
        # Fallback to default for non-wav files
        return super().do_GET()

if __name__ == '__main__':
    port = int(sys.argv[1]) if len(sys.argv) > 1 else 8081
    print(f"Starting CORS-enabled static file server on http://localhost:{port}")
    print("Press Ctrl+C to stop.")
    
    socketserver.ThreadingTCPServer.allow_reuse_address = True
    with socketserver.ThreadingTCPServer(("", port), CORSRequestHandler) as httpd:
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            print("\nShutting down server.")
