# @name: relationships.py
# @creation_date: 2022-04-11
# @license: The MIT License <https://opensource.org/licenses/MIT>
# @author: Simon Bowie <ad7588@coventry.ac.uk>
# @purpose: functions for relationships
# @acknowledgements:

from .models import Resource
from .models import Relationship
from . import db
import markdown

# function to retrieve linked resources
def get_relationships(primary_id):
    primary_relationships = Relationship.query.filter_by(first_resource_id=primary_id).all()
    links = []
    if primary_relationships:
        links = []
        for relationship in primary_relationships:
             secondary_id = relationship.second_resource_id
             links.extend(Resource.query.filter_by(id=secondary_id).filter_by(published=True).all())
        secondary_relationships = Relationship.query.filter_by(second_resource_id=primary_id).all()
        if secondary_relationships:
            for relationship in secondary_relationships:
                primary_id = relationship.first_resource_id
                links.extend(Resource.query.filter_by(id=primary_id).filter_by(published=True).all())
        return links
    else:
        secondary_relationships = Relationship.query.filter_by(second_resource_id=primary_id).all()
        if secondary_relationships:
            links = []
            for relationship in secondary_relationships:
                primary_id = relationship.first_resource_id
                links.extend(Resource.query.filter_by(id=primary_id).filter_by(published=True).all())
            return links

# function to append relationships to a resource object
def append_relationships(resource):
    relationships = get_relationships(resource.id)
    if relationships:
        for relationship in relationships:
            if relationship.type == 'tool':
                if 'tools' not in resource.__dict__.keys():
                    resource.__dict__['tools'] = []
                    resource.__dict__['tools'].append(relationship)
                else:
                    resource.__dict__['tools'].append(relationship)
            elif relationship.type == 'practice':
                # render Markdown as HTML
                relationship.description = markdown.markdown(relationship.description)
                if 'practices' not in resource.__dict__.keys():
                    resource.__dict__['practices'] = []
                    resource.__dict__['practices'].append(relationship)
                else:
                    resource.__dict__['practices'].append(relationship)
            elif relationship.type == 'book':
                # render Markdown as HTML
                relationship.description = markdown.markdown(relationship.description)
                if 'books' not in resource.__dict__.keys():
                    resource.__dict__['books'] = []
                    resource.__dict__['books'].append(relationship)
                else:
                    resource.__dict__['books'].append(relationship)
        return resource
    else:
        return resource

# function to append relationships to a dictionary of resources
def append_relationships_multiple(resources):
    for index, resource in enumerate(resources):
        resources[index] = append_relationships(resource)
    return resources

# function to append relationships to a pagination object of resources
def append_relationships_multiple_paginated(pagination):
    for item in (pagination.items):
        item = append_relationships(item)
    return pagination

# function to add a relationship to a linked resource
def add_relationship(resource_id, linked_resource_id):
    first_resource_id = resource_id
    second_resource_id = linked_resource_id
    new_relationship = Relationship(first_resource_id=first_resource_id, second_resource_id=second_resource_id)

    # add the new relationship to the database
    db.session.add(new_relationship)
    db.session.commit()

# function to delete a single relationship
def delete_relationship(main_id, for_deletion_id):
    relation = Relationship.query.filter(((Relationship.first_resource_id == main_id) & (Relationship.second_resource_id == for_deletion_id)) | ((Relationship.first_resource_id == for_deletion_id) & (Relationship.second_resource_id == main_id))).first()
    deletion = Relationship.query.get(relation.id)
    db.session.delete(deletion)
    db.session.commit()
    
# logic for editing relationships 
def edit_relationships(resource_id, linked_resources, remove_linked_resources, existing_relationships):
    if linked_resources:
        for linked_resource in linked_resources:
            link = Resource.query.get(linked_resource)
            if existing_relationships and link not in existing_relationships:
                add_relationship(resource_id, linked_resource)
            elif not existing_relationships:
                add_relationship(resource_id, linked_resource)
    if remove_linked_resources:
        for remove_linked_resource in remove_linked_resources:
            delete_relationship(resource_id, remove_linked_resource)