class Jobcodes(TsAPI):
  def __init__(self, page:int=1):
    self.page = str(page)
    super(Jobcodes, self).__init__(rest_method='GET', reference='jobcodes', query_string={"page":self.page})
    self.data_transformation = DataTransformation(self.__addJobcodes())
    
  def __addJobcodes(self):
    return [Jobcode(**value1).values() for value in self.getRequest()['results'].values() for value1 in value.values()]

  @staticmethod
  def __tranformListToStr(lst:list):
    return list(map(str, lst))

  def applyTransformation(self):
    """This method applies specific transformations to the DataTransformantion obj (e.g See the Class)
    
    Aguments:
     None 
    Returns:
     None
    """
    # Cleaning str columns
    self.data_transformation.cleaningStrColumns(['name','last_modified', 'created'])
    # Cleaning dates columns
    self.data_transformation.cleaningDates(['last_modified', 'created'])
    # Transform the attribute locations to str
    self.data_transformation.listToStr('locations')
    # Opening rows for the locations list
    self.data_transformation.listToRows('locations', 'id', 'location')
  def __init__(self, days:int=None, modified_since:int=None, page:int=1):
    """This simulates a factory Method
    """
    self.page = page

    if days is not None:
      self.__start_date = (dt.datetime.now() - dt.timedelta(days=days)).date().strftime('%Y-%m-%d')
      self.__end_date = dt.datetime.now().date().strftime('%Y-%m-%d')
      super(Timesheets, self).__init__(rest_method='GET', reference='timesheets', query_string={"start_date":self.__start_date, "end_date":self.__end_date, "page":self.page})
    else:
      # YYYY-MM-DDThh:mm:ss±hh:mm
      self.__modified_since = (dt.datetime.now() - dt.timedelta(days=modified_since)).date().strftime('%Y-%m-%d') + 'T00:00:00+00:00'
      super(Timesheets, self).__init__(rest_method='GET', reference='timesheets', query_string={"modified_since":self.__modified_since, "page":self.page})

    self.data_transformation = DataTransformation(self.__addTimesheets())
class Payrolls(TsAPI):
  def __init__(self, days:int=1):
    super(Payrolls, self).__init__(rest_method='POST', reference='reports/payroll', days=days)
    self.data_transformation = DataTransformation(self.__addPayrolls())
      
  def __addPayrolls(self):
    return [Payroll(**value1).values() for value in self.getRequest()['results'].values() for value1 in value.values()]
  
  # def getTotalPages(self):
  #   from math import ceil    
  #   return ceil(np.sum(self.data['timesheet_count'])/50)

  def applyTransformation(self):
    """This method applies specific transformations to the DataTransformantion obj (e.g See the Class)
    
    Aguments:
     None 
    Returns:
     None
    """
    # Cleaning str columns
    self.data_transformation.cleaningStrColumns(['start_date','end_date'])
class Users(TsAPI):
  def __init__(self, page:int=1):
    self.page = str(page)
    super(Users, self).__init__(rest_method='GET', reference='users', query_string={"page":page})
    self.data_transformation = DataTransformation(self.__addUsers())
  
  def __addUsers(self):
    return [User(**value1).values() for value in self.getRequest()['results'].values() for value1 in value.values()]

  def applyTransformation(self):
    """This method applies specific transformations to the DataTransformantion obj (e.g See the Class)
    
    Aguments:
     None 
    Returns:
     None
    """
    # Cleaning str columns
    self.data_transformation.cleaningStrColumns(['first_name','last_name','username','email',
                                                 'hire_date','term_date','last_modified','last_active','created','client_url',
                                                 'company_name','profile_image_url','display_name','pronouns','pay_interval'])
    # Cleaning dates columns
    self.data_transformation.cleaningDates(['last_modified','last_active','created'])
class Groups(TsAPI):
  def __init__(self, page:int=1):
    self.page = str(page)
    super(Groups, self).__init__(rest_method='GET', reference='groups', query_string={"page":self.page})
    self.data_transformation = DataTransformation(self.__addGroups())
  
  def __addGroups(self):
    return [Group(**value1).values() for value in self.getRequest()['results'].values() for value1 in value.values()]
  
  def applyTransformation(self):
    """This method applies specific transformations to the DataTransformantion obj (e.g See the Class)
    
    Aguments:
     None 
    Returns:
     None
    """
    # Cleaning str columns
    self.data_transformation.cleaningStrColumns(['name','last_modified', 'created'])
    # Cleaning dates columns
    self.data_transformation.cleaningDates(['last_modified', 'created'])
    # Transform the list of manager_ids to manager_id (e.g opening the rows)
    self.data_transformation.listToRows('manager_ids', 'id', 'manager_id')
class Timesheets(TsAPI):
  def __init__(self, days:int=None, modified_since:int=None, page:int=1):
    """This simulates a factory Method
    """
    self.page = page

    if days is not None:
      self.__start_date = (dt.datetime.now() - dt.timedelta(days=days)).date().strftime('%Y-%m-%d')
      self.__end_date = dt.datetime.now().date().strftime('%Y-%m-%d')
      super(Timesheets, self).__init__(rest_method='GET', reference='timesheets', query_string={"start_date":self.__start_date, "end_date":self.__end_date, "page":self.page})
    else:
      # YYYY-MM-DDThh:mm:ss±hh:mm
      self.__modified_since = (dt.datetime.now() - dt.timedelta(days=modified_since)).date().strftime('%Y-%m-%d') + 'T00:00:00+00:00'
      super(Timesheets, self).__init__(rest_method='GET', reference='timesheets', query_string={"modified_since":self.__modified_since, "page":self.page})

    self.data_transformation = DataTransformation(self.__addTimesheets())
  
  def __addTimesheets(self):
    return [Timesheet(**value1).values() for value in self.getRequest()['results'].values() for value1 in value.values()]
  
  def applyTransformation(self):
    """This method applies specific transformations to the DataTransformantion obj (e.g See the Class)
    
    Aguments:
     None 
    Returns:
     None
    """
    # Cleaning str columns
    self.data_transformation.cleaningStrColumns(['start','end','date','tz_str','tz_str','location',
                                                 'on_the_clock','notes','last_modified','customfields'])
    # Cleaning dates columns
    self.data_transformation.cleaningDates(['start','end','last_modified'])

    # Cleaning double quoting
    self.data_transformation.removingDoubleQuoting('customfields')
 def __init__(self, page:int=1):
   self.page = str(page)
   super(Jobcodes, self).__init__(rest_method='GET', reference='jobcodes', query_string={"page":self.page})
   self.data_transformation = DataTransformation(self.__addJobcodes())
 def __init__(self, days:int=1):
   super(Payrolls, self).__init__(rest_method='POST', reference='reports/payroll', days=days)
   self.data_transformation = DataTransformation(self.__addPayrolls())