# © 2020 Le Filament (<http://www.le-filament.com>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

import requests
import logging
import json

from odoo import models, exceptions, tools, api

_logger = logging.getLogger(__name__)


class LeFilamentAlfresco(models.AbstractModel):
    """ Appelle l'API alfresco et implémente les fonctions suivantes :

    """
    _inherit = 'lefilament.alfresco'

    def alfresco_publipostage_documents(self, url, filename, templateNodeRef, convertToPDF, keys, options, backend):

        # Remplissage des données de base
        json_data = {
            "fileName": filename,
            "templateNodeRef": templateNodeRef,
            "convertToPDF": False,
            "keys": keys
        }

        # Ajout des options Alfresco à envoyer
        json_data.update(options)
        print("------ json_data---", str(json_data))
        return self.alfresco_publipostage(
                url=url, 
                json=json_data,
                backend=backend)

    def alfresco_publipostage(self, url, json, backend):
        """ Génération d'un document via Alfresco

        :param dict: variables envoyés
        """
        return self.alfresco_get_by_url(
            url=url, 
            call_type='post', 
            json=json, 
            backend=backend)

    def generate_public_link(self, url, backend=None):
        """ Récupératin du lien public d'un docuement à partir d'une URL

                :param url: Url avec ID du Noderef du doc
                """
        result = self.alfresco_get_by_url(url=url, call_type='post', backend=backend)
        res = result.content.decode('utf8').replace("'", '"')
        data = json.loads(res)
        sharedId = data.get('sharedId')
        return backend.url + '/share/s/' + sharedId

    def copy_document(self, url, workspace, workspace_parent, backend=None):
        """ Copie d'un document à partir d'un ID dans un dossier

                :param url: Url avec ID du Noderef du dossier
                :param workspace: ID du document à copier
                :param workspace_parent: ID du dossier
                """
        result = self.alfresco_get_by_url(
            url=url,
            call_type='post',
            json={
                "nodeRefs":
                    [workspace],
                "parentId": workspace_parent
            },
            backend=backend)
        res = result.content.decode('utf8').replace("'", '"')
        data = json.loads(res)
        nodeDoc = data.get('results')[0].get('nodeRef').replace('workspace://SpacesStore/', '')
        return nodeDoc

    def create_json_file(self, file_name, virtual_json, json_file_cmis):
        """ Crée un dossier virtuel à partir d'un node ref d'un dossier, puis associe
            un fichier json sur la propriété "Modèle de dossier intelligent"

                :param file_name: Nom du dossier créé et du fichier JSON
                :param virtual_json: fichier json
                :param json_file_cmis: Noderef du dossier où créer le dossier virtuel
                """
        backend = self.env['cmis.backend'].search([], limit=1)
        parent_path = backend.get_cmis_repository().getFolder(
            json_file_cmis).getPaths()

        path_to_create = parent_path + [file_name]
        path = '/'.join(path_to_create)

        # Création du dossier virtuel
        cmis_folder = backend.get_folder_by_path(path)

        js = json.dumps(virtual_json, indent=4)
        prop = {
            'cmis:secondaryObjectTypeIds': ['P:adefpat:justificatif'],
        }
        # Création du JSON
        repo = backend.get_cmis_repository().getObject(json_file_cmis)
        file = repo.createDocument(
            name=file_name + ".json",
            properties=prop,
            contentFile=js,
            contentType="application/json"
        )
        noderef_file_id = file.getProperties().get('alfcmis:nodeRef')

        # Mise à jour des propriétés du dossier virtuel
        prop_folder = {
            'cmis:secondaryObjectTypeIds': [
                'P:smf:customConfigSmartFolder',
                'P:cm:taggable',
                'P:up:UploadFolder',
                'P:cm:titled',
                'P:sys:localized'
            ],
        }
        cmis_folder.updateProperties(prop_folder)

        # Association du fichier JSON au dossier virtuel
        noderef_folder_id = cmis_folder.getProperties().get('cmis:objectId')
        url = '/alfresco/s/api/node/workspace/SpacesStore/' + noderef_folder_id + '/formprocessor'
        self.alfresco_get_by_url(
            url=url,
            call_type='post',
            json={
                "assoc_smf_custom-template-association_added": noderef_file_id
            },
            backend=backend)

        properties = cmis_folder.getProperties()
        url = backend.get_content_details_url_from_props(properties)
        return {
            'type': 'ir.actions.act_url',
            'url': url,
            'target': 'new',
        }