from fastapi import FastAPI, Query,HTTPException
from v1.responseModel import ScholixType,convert_response
import logging
from typing import List
from eu.dnetlib.ScholixConnector import ScholixConnector
import logging

log = logging.getLogger("scholexplorer")

subapi_v1 = FastAPI(title="Scholexplorer API 1.0",
    version="2.0.0",
    description="scholexplorer API version 1.0",openapi_prefix="/v1", docs_url="/ui/")

@subapi_v1.get("/linksFromDatasource", 
        tags=["Scholix"], 
        summary="Get all scholix relation collected from a datasource",     
        description="return a list of scholix object collected from a specific datasource" ,
        response_model=List[ScholixType]        
        )
def links_from_datasource(datasource: str = Query((...),title="datasource", description="Filter Scholix relationships collected from a LinkProvider"),page:int= Query(None, title="page", description="select page of result")):
    s = ScholixConnector()
    m_page = 0
    if page:
            m_page= page*100      
    if m_page > 9999:
        raise HTTPException(status_code=400,detail="MAX NUMBER OF PAGE REACHED")  
    return convert_response(s.links(provider=datasource, page= m_page))


@subapi_v1.get("/linksFromPid", 
        tags=["Scholix"], 
        summary="Retrieve all scholix links from a persistent identifier",     
        description="The linksFromPid endpoint returns a list of scholix object related from a specific persistent identifier" ,
        response_model=List[ScholixType]        
        )
def links_from_pid(
    pid: str = Query((...), title="pid", description="persistent Identifier"),
    pidType: str = Query(None, title="pidType", description="Persistent Identifier Type"),
    typologyTarget: str = Query(None, title="targetPidType", description="typology target filter should be publication, dataset or unknown"),
    datasourceTarget: str = Query(None, title="datasourceTarget", description="a datasource provenace filter of the target relation"),
    page:int= Query(None, title="page", description="select page of result")):
    s = ScholixConnector()    
    m_page = 0
    if page:
            m_page= page*100      
    if m_page > 9999:
        raise HTTPException(status_code=400,detail="MAX NUMBER OF PAGE REACHED")  
    return convert_response(s.links(s_pid =pid,s_pid_type= pidType,source_Type= typologyTarget, provider = datasourceTarget) )


@subapi_v1.get("/linksFromPublisher", 
        tags=["Scholix"], 
        summary="Get all scholix relation collected from a publisher",     
        description="return a list of scholix object published from a specific publisher" ,
        response_model=List[ScholixType]        
        )
def links_from_publisher(publisher: str = Query((...),title="publisher", description="Filter Scholix relationships collected from a publisher"),page:int= Query(None, title="page", description="select page of result")):
    s = ScholixConnector()
    m_page = 0
    if page:
            m_page= page*100      
    if m_page > 9999:
        raise HTTPException(status_code=400,detail="MAX NUMBER OF PAGE REACHED")  
    return convert_response(s.links(t_publisher=publisher, page= m_page))


@subapi_v1.get("/listDatasources", 
        tags=["Datasources"], 
        summary="Get all datasources",     
        description="returns a list of all datasources" ,
        response_model=List[str]        
        )
def list_datasources():
    s = ScholixConnector()

    for item in s.list_datasources():
        yield item['name']

    

