from modules.face_restoration import FaceRestoration
from scripts.faceswaplab_utils.faceswaplab_logging import logger
from PIL import Image
from scripts.faceswaplab_postprocessing.postprocessing_options import PostProcessingOptions, InpaintingWhen
from scripts.faceswaplab_postprocessing.i2i_pp import img2img_diffusion
from scripts.faceswaplab_postprocessing.upscaling import upscale_img, restore_face


def enhance_image(image: Image.Image, pp_options: PostProcessingOptions) -> Image.Image:
    result_image = image
    try :
        if pp_options.inpainting_when == InpaintingWhen.BEFORE_UPSCALING.value :
            result_image = img2img_diffusion(image, pp_options)
        result_image = upscale_img(result_image, pp_options)

        if pp_options.inpainting_when == InpaintingWhen.BEFORE_RESTORE_FACE.value :
            result_image = img2img_diffusion(image,pp_options)

        result_image = restore_face(result_image, pp_options)
              
        if pp_options.inpainting_when == InpaintingWhen.AFTER_ALL.value :
            result_image = img2img_diffusion(image,pp_options)

    except Exception as e:
        logger.error("Failed to upscale %s", e)

    return result_image