"""
OnlyLegs - Metatada Parser
Parse metadata from images if available
otherwise get some basic information from the file
"""
import os
import logging

from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

from .helpers import *
from .mapping import *

class Metadata:
    """
    Metadata parser
    """
    def __init__(self, file_path):
        """
        Initialize the metadata parser
        """
        self.file_path = file_path
        img_exif = {}

        try:
            file = Image.open(file_path)
            tags = file._getexif()
            img_exif = {}

            for tag, value in TAGS.items():
                if tag in tags:
                    img_exif[value] = tags[tag]

            img_exif['FileName'] = os.path.basename(file_path)
            img_exif['FileSize'] = os.path.getsize(file_path)
            img_exif['FileFormat'] = img_exif['FileName'].split('.')[-1]
            img_exif['FileWidth'], img_exif['FileHeight'] = file.size

            file.close()
        except TypeError:
            img_exif['FileName'] = os.path.basename(file_path)
            img_exif['FileSize'] = os.path.getsize(file_path)
            img_exif['FileFormat'] = img_exif['FileName'].split('.')[-1]
            img_exif['FileWidth'], img_exif['FileHeight'] = file.size

        self.encoded = img_exif

    def yoink(self):
        """
        Yoinks the metadata from the image
        """
        if not os.path.isfile(self.file_path):
            return None
        return self.format_data(self.encoded)

    def format_data(self, encoded_exif): # pylint: disable=R0912 # For now, this is fine
        """
        Formats the data into a dictionary
        """
        exif = {
            'Photographer': {},
            'Camera': {},
            'Software': {},
            'File': {},
        }

        for data in encoded_exif:
            if data in PHOTOGRAHER_MAPPING:
                exif['Photographer'][PHOTOGRAHER_MAPPING[data][0]] = {
                        'raw': encoded_exif[data],
                    }
            elif data in CAMERA_MAPPING:
                if len(CAMERA_MAPPING[data]) == 2:
                    exif['Camera'][CAMERA_MAPPING[data][0]] = {
                            'raw': encoded_exif[data],
                            'formatted':
                                getattr(helpers, CAMERA_MAPPING[data][1])(encoded_exif[data]), # pylint: disable=E0602
                        }
                else:
                    exif['Camera'][CAMERA_MAPPING[data][0]] = {
                            'raw': encoded_exif[data],
                        }
            elif data in SOFTWARE_MAPPING:
                if len(SOFTWARE_MAPPING[data]) == 2:
                    exif['Software'][SOFTWARE_MAPPING[data][0]] = {
                            'raw': encoded_exif[data],
                            'formatted':
                                getattr(helpers, SOFTWARE_MAPPING[data][1])(encoded_exif[data]), # pylint: disable=E0602
                        }
                else:
                    exif['Software'][SOFTWARE_MAPPING[data][0]] = {
                            'raw': encoded_exif[data],
                        }
            elif data in FILE_MAPPING:
                if len(FILE_MAPPING[data]) == 2:
                    exif['File'][FILE_MAPPING[data][0]] = {
                            'raw': encoded_exif[data],
                            'formatted':
                                getattr(helpers, FILE_MAPPING[data][1])(encoded_exif[data]), # pylint: disable=E0602
                        }
                else:
                    exif['File'][FILE_MAPPING[data][0]] = {
                            'raw': encoded_exif[data]
                        }

        # Remove empty keys
        if len(exif['Photographer']) == 0:
            del exif['Photographer']
        if len(exif['Camera']) == 0:
            del exif['Camera']
        if len(exif['Software']) == 0:
            del exif['Software']
        if len(exif['File']) == 0:
            del exif['File']

        return exif
