from typing import Any
from base64 import b64decode

class InputRequest:
  def __init__(self, event:dict) -> None:
    self.user_id = event['UserId']
    self.image_bytes = event['Image'] if event.get('Image') != None else None
    self.bucket = event['Bucket']
    self.name = event['Name']

    
    if 'FaceId' in event:
      self.face_id = event['FaceId']
    else:
      self.face_id = 'FACEID_NOT_AVAIL'

    if 'Properties' in event:
      self.property_bag = event['Properties']
    else:
      self.property_bag = {}

  @property
  def user_id(self)->str:
    return self.__user_id

  @user_id.setter
  def user_id(self, value:str)->None:
    self.__user_id = value.lower()

  @property
  def face_id(self)->str:
    return self.__face_id

  @face_id.setter
  def face_id(self, value:str)->None:
    self.__face_id = value

  @property
  def image_bytes(self)->bytes:
    return self.__image

  @image_bytes.setter
  def image_bytes(self, value:Any)->None:
    if isinstance(value, bytes):
      self.__image = value
    elif isinstance(value, str):
      self.__image = b64decode(value)
    else:
      self.__image = None

  @property
  def property_bag(self)->dict:
    return self.__property_bag

  @property_bag.setter
  def property_bag(self, value:dict)->None:
    self.__property_bag = value

  @property
  def bucket(self)->str:
    return self.__bucket

  @bucket.setter
  def bucket(self, value:str)->None:
    self.__bucket = value

  @property
  def name(self)->str:
    return self.__name

  @name.setter
  def name(self, value:str)->None:
    self.__name = value

  def to_dyanmodb_item(self)->dict:
    '''
    Encodes this object as Amazon DyanmoDB Item.
    '''
    return {
      'PartitionKey': {'S': 'User::{}'.format(self.user_id)},
      'SortKey': {'S': self.face_id },
      #'image': {'B', self.image },
      'property_bag': {'M': InputRequest.ddb_encode_dict(self.property_bag) }
    }

  @staticmethod
  def ddb_encode_dict(dict:dict)->dict:
    encoded = {}
    for key in dict.keys():
      encoded[str(key)] = {'S': str(dict[key]) }
    return encoded