# TextSynth text to image example
import sys
import argparse
import requests
import json
import time
import base64

parser = argparse.ArgumentParser(description='TextSynth text to image example')
parser.add_argument('--url', type=str, default = "https://api.textsynth.com", help="server URL")
parser.add_argument('--api_key', type=str, default = "")
parser.add_argument('--seed', type=int, default = None, help="seed (0 = random)")
parser.add_argument('--model', type=str, default = "stable_diffusion", help = "model name")
parser.add_argument('-o', type=str, default = "/tmp/out.jpg", help="output image")
parser.add_argument('--width', type=int, default = 512, help="generated image width")
parser.add_argument('--height', type=int, default = 512, help="generated image height")
parser.add_argument('--image', type=str, default = None, help="optional initial image filename (JPEG)")
parser.add_argument('--strength', type=float, default=0.5, help="strength, only meaningful when --image is used")
parser.add_argument('--image_count', type=int, default = 1, help="number of generate images")
parser.add_argument('prompt', type=str, help="image generation prompt")

args = parser.parse_args()

def make_request(path, json):
    response = requests.post(args.url + path, headers = { "Authorization": "Bearer " + args.api_key }, json = json)
    return response

def main():
    req = { "prompt": args.prompt, "image_count": args.image_count, "width": args.width, "height": args.height,
            "strength": args.strength }
    if args.seed != None:
        req["seed"] = args.seed
        
    if args.image != None:
        f = open(args.image, "rb")
        image_data = f.read()
        f.close()
        req["image"] = base64.b64encode(image_data).decode('ascii')
        
    result = make_request("/v1/engines/" + args.model + "/text_to_image", req);
    if result.status_code != 200:
        print("Request error:", result.text)
        sys.exit(1)

    resp = result.json()
    #    print(json.dumps(resp, indent=4, ensure_ascii=False))
    images = resp["images"]
    for i in range(len(images)):
        data = images[i]["data"]
        image = base64.b64decode(data)
        filename = args.o
        filename = filename.replace("%d", str(i))
        f = open(filename, "wb")
        f.write(image)
        f.close()
    
main()
