from http.server import BaseHTTPRequestHandler, HTTPServer
from json import loads
from PIL import Image, ImageDraw, ImageFont
from urllib.parse import urlparse
from functools import cached_property
from base64 import b64decode
class WebServer(BaseHTTPRequestHandler):    
    def generateImage(self, post_data):
        try:
            data = loads(post_data)
            print(data)
        except ValueError:
            self.sendErrorMessage("Invalid JSON")
            return
        
        if "text" not in data:
            self.sendErrorMessage("Text Parameter not found")
            return
        if "width" not in data:
            self.sendErrorMessage("Width Parameter not found")
            return
        if "height" not in data:
            self.sendErrorMessage("Height Parameter not found")
            return
        width = data["width"]
        height = data["height"]
        text = data["text"]
        if "fontSize" in data:
            fontSize = data["fontSize"]
        else:
            fontSize = 15
            
        if "lineSpacing" in data:
            lineSpacing = data["lineSpacing"]
        else:
            lineSpacing = 0
        
        img = Image.new('P', (width, height))
        palette = [
            255, 255, 255,  # white
            0, 0, 0,        # black
            255, 0, 0       # red
        ]
        img.putpalette(palette)

        draw = ImageDraw.Draw(img)
        font = ImageFont.truetype("/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf", fontSize)
        for i, line in enumerate(text):
            color = line["color"]
            draw.text((0, 0 + (fontSize + lineSpacing) * i), line["text"], fill=color, font=font)
        
        
        self.send_response(200)
        self.send_header('Content-Type','image/jpeg')
        self.end_headers()
        rgb_image = img.convert('RGB')
        rgb_image.save(self.wfile, "JPEG", optimize=False, quality=100, progressive=False, subsampling=0, icc_profile=None)
        
        
    @cached_property
    def url(self):
        return urlparse(self.path)
    def sendErrorMessage(self, message, statusCode = 400):
        self.send_response(statusCode)
        self.send_header('Content-Type','text/plain')
        self.end_headers()
        self.wfile.write(message.encode('utf-8'))

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length)
        self.generateImage(post_data)
            
            
    def do_GET(self):
        if(self.url.path == "/image.jpg"):
            self.generateImage(b64decode(self.url.query))
            return
        
        self.send_response(200)
        self.send_header('Content-Type','text/plain')
        self.end_headers()
        self.wfile.write(b'Text to Image Server\n')

if __name__ == "__main__":        
    webServer = HTTPServer(("0.0.0.0", 8080), WebServer)
    print("Server started")
    webServer.serve_forever()