# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import sys
import base64
from paddle_serving_server_gpu.web_service import WebService

import utils


class ImageService(WebService):
    def __init__(self, name):
        super(ImageService, self).__init__(name=name)
        self.operators = self.create_operators()

    def create_operators(self):
        size = 224
        img_mean = [0.485, 0.456, 0.406]
        img_std = [0.229, 0.224, 0.225]
        img_scale = 1.0 / 255.0
        decode_op = utils.DecodeImage()
        resize_op = utils.ResizeImage(resize_short=256)
        crop_op = utils.CropImage(size=(size, size))
        normalize_op = utils.NormalizeImage(
            scale=img_scale, mean=img_mean, std=img_std)
        totensor_op = utils.ToTensor()
        return [decode_op, resize_op, crop_op, normalize_op, totensor_op]

    def _process_image(self, data, ops):
        for op in ops:
            data = op(data)
        return data

    def preprocess(self, feed={}, fetch=[]):
        feed_batch = []
        for ins in feed:
            if "image" not in ins:
                raise ("feed data error!")
            sample = base64.b64decode(ins["image"])
            img = self._process_image(sample, self.operators)
            feed_batch.append({"image": img})
        return feed_batch, fetch


image_service = ImageService(name="image")
image_service.load_model_config(sys.argv[1])
image_service.set_gpus("0")
image_service.prepare_server(
    workdir=sys.argv[2], port=int(sys.argv[3]), device="gpu")
image_service.run_server()
image_service.run_flask()
