#!/usr/bin/env python3
import sys
import os
import json
from http.server import HTTPServer, BaseHTTPRequestHandler
from socketserver import ThreadingMixIn

# Pastikan direktori script ter-import
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(CURRENT_DIR)

print("[OCR Service] Memulai inisialisasi model Neural Network RapidOCR ke dalam RAM...")
import ocr_ktp
print("[OCR Service] Sukses! Model RapidOCR telah siap menyerap instruksi dengan kecepatan kilat.")

HOST = "127.0.0.1"
PORT = 58201

class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
    daemon_threads = True
    allow_reuse_address = True

class OCRRequestHandler(BaseHTTPRequestHandler):
    def send_json_response(self, status_code, data):
        self.send_response(status_code)
        self.send_header("Content-Type", "application/json; charset=utf-8")
        self.end_headers()
        response_bytes = json.dumps(data, default=str, ensure_ascii=False).encode("utf-8")
        self.wfile.write(response_bytes)

    def do_GET(self):
        if self.path == "/health":
            self.send_json_response(200, {"status": "ok", "service": "OCR KTP Microservice", "port": PORT})
        else:
            self.send_json_response(404, {"error": "Not Found. Use POST /ocr to process images."})

    def do_POST(self):
        if self.path != "/ocr":
            self.send_json_response(404, {"error": "Endpoint not found. Only POST /ocr is supported."})
            return

        try:
            content_length = int(self.headers.get("Content-Length", 0))
            if content_length == 0:
                self.send_json_response(400, {"error": "Empty request body"})
                return

            post_data = self.rfile.read(content_length).decode("utf-8")
            payload = json.loads(post_data)

            file_path = payload.get("file_path")
            if not file_path:
                self.send_json_response(400, {"error": "file_path is required in JSON payload"})
                return

            if not os.path.exists(file_path):
                self.send_json_response(404, {"error": f"File not found on server disk: {file_path}"})
                return

            # Jalankan analisa dengan mesin RapidOCR yang sudah siap di RAM
            result = ocr_ktp.process_file(file_path)
            self.send_json_response(200, result)

        except Exception as e:
            self.send_json_response(500, {"error": str(e)})

    def log_message(self, format, *args):
        print(f"[OCR Service Request] {self.client_address[0]} - {format % args}")

def run_server():
    server_address = (HOST, PORT)
    httpd = ThreadedHTTPServer(server_address, OCRRequestHandler)
    print(f"[OCR Service] Aktif dan mendengarkan permintaan di http://{HOST}:{PORT}/ ...")
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        print("\n[OCR Service] Mematikan layanan secara tertib...")
        httpd.server_close()

if __name__ == "__main__":
    run_server()
