# -*- coding: utf-8 -*-

import os
import numpy as np
from PIL import Image
import py360convert
import cv2
from pathlib import Path

def conv_e2p(imagePath, incl, outFolderPath):
    # Ensure the paths are Path objects
    imagePath = Path(imagePath)
    outFolderPath = Path(outFolderPath)
    '''
    conv_e2p
    py360convertのe2pを使って、360VR画像から足元の画像を切り出す
    参考：　https://github.com/sunset1995/py360convert
    pip install py360convertでpy360convertモジュールを環境にインストールしておくこと
    
    視野角：　fov_deg=(60, 60)と出力画像サイズ：out_hw=(500, 500)は既定値とする 
    前、右、後、左の順に、ファイル名に'_1'、'_2'･･･をつけて原画像ファイルと同じ場所に書き出す。
    '''
    #print("conv_e2p")
    img = np.array(Image.open(imagePath))
    if len(img.shape) == 2:
        img = img[..., None]

    # 足元の4方向
    for n in range(1,5):
        out = py360convert.e2p(img, fov_deg=(60,60), u_deg=(n-1)*90, v_deg=incl, out_hw=(500,500))
        outPath = outFolderPath / f"{Path(imagePath).stem}_{n}.jpg"
        # print(outPath)
        Image.fromarray(out.astype(np.uint8)).save(outPath)

'''
    imread, imwrite
    2021.06.21 cv2のimreadとimwriteが日本語文字のパス名に対応していないので、
    imreadはnp.fromfile + cv2.imdecodeで、
    imwriteはnp.tofile + cv2.imencodeで代用する。
    参考：　https://qiita.com/SKYS/items/cbde3775e2143cad7455
'''
def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8):
    try:
        n = np.fromfile(filename, dtype)
        img = cv2.imdecode(n, flags)
        return img
    except Exception as e:
        print(e)
        return None
    
def imwrite(filename, img, params=None):
    try:
        ext = os.path.splitext(filename)[1]
        result, n = cv2.imencode(ext, img, params)

        if result:
            with open(filename, mode='wb') as f:
                n.tofile(f)
            return True
        else:
            return False
    except Exception as e:
        print(e)
        return False

def getVegAndSoil(imagePath, lowH, highH, lowV, highV):
    '''
    getVegAndSoil
    HとVの値を閾値として、植生と土壌のピクセルを抽出した2値画像を返す
    参考：　https://axa.biopapyrus.jp/ia/examples/leaf-detection/
    '''
    #print("Clip Image Path2:",imagePath)
    # load image and change the color spaces
    # img = cv2.imread(img_in) '日本語非対応
    img = imread(imagePath)
    # greenPath = Path.splitext(imagePath)[0] + '_veg.jpg'
    # soilPath = Path.splitext(imagePath)[0] + '_soil.jpg'
    
    # change BGR to HSV
    # H: 0-179, S: 0-255, V: 0-255
    img_HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # smoothing
    img_HSV = cv2.GaussianBlur(img_HSV, (5, 5), 3)
    
    # split photo into 3 channels (H, S, V)
    img_H, img_S, img_V = cv2.split(img_HSV)
        
    # binary transformation ( use H S V channnel)
    # 植生
    _thre, img_H1 = cv2.threshold(img_H, lowH / 360 * 179, 255, cv2.THRESH_BINARY_INV)     
    _thre, img_H2 = cv2.threshold(img_H, highH / 360 * 179, 255, cv2.THRESH_BINARY_INV)
    img_greenarea = 255 - (img_H2 - img_H1)
    # 土壌
    _thre, img_V1 = cv2.threshold(img_V, lowV, 255, cv2.THRESH_BINARY_INV)     
    _thre, img_V2 = cv2.threshold(img_V, highV, 255, cv2.THRESH_BINARY_INV)
    img_soilarea = 255 - (img_V2 - img_V1)
    
    # save
    # cv2.imwrite('C:/Users/GIS2/Desktop/soil-test/test7-soitout-HSV'+'.jpg', img_soilarea)　'日本語非対応
    # imwrite(greenPath, img_greenarea)
    # imwrite(soilPath, img_soilarea)
    return img_greenarea, img_soilarea

'''
2021/07/01 
ExifLib.py
    exif_get4.pyをもとに改変
    1)print1() -> GPSinfo()
    2)print2() -> DateTime()
    3)上記2関数で、self.exifがFalseだったときのprint()をコメントアウトしてコアマンドライン出力を抑制
'''

import PIL.ExifTags as ExifTags

class ExifImage:

    def __init__(self, fname):
        # 画像ファイルを開く --- (*1)
        self.img = Image.open(fname)
        self.exif = {}
        if self.img._getexif():
            for k, v in self.img._getexif().items():
                if k in ExifTags.TAGS:
                    self.exif[ExifTags.TAGS[k]] = v
                    
    def GPSinfo(self):
        if self.exif:
            for k, v in self.exif.items():
                # print(k, ":", v)
                if k=="GPSInfo":
                    #print('GPSInfo :',v) 
                    GPSinfo=v
                    return GPSinfo
        #else:
            #print("exif情報は記録されていません。")
            
    def DateTime(self):
        if self.exif:    
            for k, v in self.exif.items():
                # print(k, ":", v)
                if k=="DateTimeOriginal":
                    #print('DateTimeOriginal :',v)
                    DateTimeOriginal=v
                    return DateTimeOriginal
        #else:
            #print("exif情報は記録されていません。")

def Exifinfo(ImageFilePath):
    '''
    ImageFilePathにある画像ファイルのExif情報から
    緯度(float)、経度(float)、画像作成時の日付時刻(string)を返す
    '''
    
    a = ExifImage(ImageFilePath)
    res1 = a.GPSinfo() 
    res2 = a.DateTime()

    if res1 and len(res1) > 4: 
        lat = res1[2]
        latDD = lat[0] + lat[1] / 60. + lat[2] / 3600.
        lon = res1[4]
        lonDD = lon[0] + lon[1] / 60. + lon[2] / 3600.
    else:
        latDD = 0.
        lonDD = 0.
    
    if res2:
        DateTimeOriginal = res2.replace(':', '/', 2)
        
    return latDD, lonDD, DateTimeOriginal 

def HSVmask(imagePath,lowValues,highValues):
    '''
    H,S,Vの範囲でピクセルを抽出し、抽出画像とマスク画像を返す
    2021.12.09
    '''
    img = imread(imagePath)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # OpenCVではHの範囲が0-179なので、2で割る
    lower = np.array([int(lowValues[0])/2, int(lowValues[1]), int(lowValues[2])])
    upper = np.array([int(highValues[0])/2, int(highValues[1]), int(highValues[2])]) 
    img_mask = cv2.inRange(hsv, lower, upper)
    img_color = cv2.bitwise_and(img, img, mask=img_mask)
    return img_color, img_mask
    
    