from pydantic import BaseModel, Schema
from typing import Dict, List
from datetime import datetime
from fastapi import HTTPException
import logging
from time import time




class LinkProvider(BaseModel):
    name:str = Schema(None, title= "The name of the Provider that provides the links", max_length= 300)
    totalRelationships:int=Schema(None, title= "The number of links that It provides")

class LinkPublisher(BaseModel):
    name:str = Schema(None, title= "The name of the Publisher that provides the links", max_length= 300)
    totalRelationships:int=Schema(None, title= "The number of links that It provides")


class IdentifierType(BaseModel):
    identifier: str = None
    schema_str:str = Schema(None, alias="schema")
    

class ScholixProviderType(BaseModel):
    name:str
    identifiers:List[IdentifierType]  =None

class RelationshipType(BaseModel):
    name:str
    schema_str:str = Schema(None, alias="schema")
    inverseRelationship:str = None

class CreatorType(BaseModel):
    name: str
    identifiers:List[IdentifierType] = None
    
class ScholixObjectType(BaseModel):
    subtype:str = None
    type:str = None

class ScholixItemType(BaseModel):
    identifiers:List[IdentifierType] =None
    title:str = None
    objectType:str 
    creators:List[CreatorType] =None    
    publisher:List[ScholixProviderType] =None 
    objectProvider: List[ScholixProviderType] =None  

class ScholixType(BaseModel):
    linkProvider:List[ScholixProviderType] =None    
    publicationDate:str =None
    relationship:RelationshipType=None
    source:ScholixItemType=None
    target:ScholixItemType=None
    
def convert_response(response):
    log = logging.getLogger("scholexplorer")    
    for item in response.hits:
        result = item.__dict__['_d_']        
        result['linkProvider'] = result.pop('linkprovider')
        if 'creator' in result['source']:
            result['source']['creators']=result['source'].pop('creator')        
        result['source'].pop('objectSubType')
        result['source']['identifiers']=result['source'].pop('identifier')
        if result['source'].get('collectedFrom') is not None:
            result['source']['objectProvider'] = [s['provider'] for s in result['source'].get('collectedFrom',[])]
        if result['source'].get('publisher') is not None:
            result['source']['publisher'] = [x for x in result['source']['publisher'] if x.get('name') is not None]

        
        
        if 'creator' in result['target']:
            result['target']['creators']=result['target'].pop('creator')
        result['target'].pop('objectSubType')
        result['target']['identifiers']=result['target'].pop('identifier')
        if result['target'].get('publisher') is not None:
            result['target']['publisher'] = [x for x in result['target']['publisher'] if x.get('name') is not None]
        if result['target'].get('collectedFrom') is not None:
            result['target']['objectProvider'] = [s['provider'] for s in result['target'].get('collectedFrom',[])]
        else:
            result['target']['objectProvider'] = []
        yield  result
