# Copyright (c) 2022 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 os
import sys
import nibabel as nib

sys.path.append(
    os.path.join(os.path.dirname(os.path.realpath(__file__)), "../.."))
import pydicom
import SimpleITK as sitk

import tools.preprocess_utils.global_var as global_var
from tools.preprocess_utils.path_utils import join_paths

gpu_tag = global_var.get_value('USE_GPU')
if gpu_tag:
    import cupy as np
else:
    import numpy as np


def load_slices(dcm_dir):
    """
    Load dcm like images
    Return img array and [z,y,x]-ordered origin and spacing
    """

    dcm_list = [join_paths(dcm_dir, i) for i in os.listdir(dcm_dir)]
    indices = np.array([pydicom.dcmread(i).InstanceNumber for i in dcm_list])
    dcm_list = np.array(dcm_list)[indices.argsort()]

    itkimage = sitk.ReadImage(dcm_list)
    numpyImage = sitk.GetArrayFromImage(itkimage)

    numpyOrigin = np.array(list(reversed(itkimage.GetOrigin())))
    numpySpacing = np.array(list(reversed(itkimage.GetSpacing())))

    return numpyImage, numpyOrigin, numpySpacing


def load_series(mhd_path):
    """
    Load mhd, nii like images
    Return img array and [z,y,x]-ordered origin and spacing
    """

    itkimage = sitk.ReadImage(mhd_path)
    numpyImage = sitk.GetArrayFromImage(itkimage)

    numpyOrigin = np.array(list(reversed(itkimage.GetOrigin())))
    numpySpacing = np.array(list(reversed(itkimage.GetSpacing())))

    return numpyImage, numpyOrigin, numpySpacing


def add_qform_sform(img_name):
    img = nib.load(img_name)
    qform, sform = img.get_qform(), img.get_sform()
    img.set_qform(qform)
    img.set_sform(sform)
    nib.save(img, img_name)
