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] = []

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

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

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

class ScholixType(BaseModel):
    linkProvider:List[ScholixProviderType] =[]    
    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']['identifiers']=result['source'].pop('identifier')
        result['source']['objectProvider'] = [s['provider'] for s in result['source'].get('collectedFrom',[])]
        if 'creator' in result['target']:
            result['target']['creators']=result['target'].pop('creator')
        result['target']['identifiers']=result['target'].pop('identifier')
        if 'collectedFrom' in result['target']:
            result['target']['objectProvider'] = [s['provider'] for s in result['target'].get('collectedFrom',[])]
        else:
            result['target']['objectProvider'] = []
        yield  result
