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

from pytz import timezone

from odoo import _, fields, models
from odoo.exceptions import UserError


class ScopAlfrescoAdhesionPartner(models.Model):
    _inherit = "res.partner"

    log_missing_docs = fields.Text("Documents manquants")

    # ------------------------------------------------------
    # Actions
    # ------------------------------------------------------
    # Email
    def get_recipients_adhesion(self):
        """
        Get recipients for email adhesion
        :return:
        """
        recipient_list = list()
        if self.director_ids:
            for director in self.director_ids:
                if director.email:
                    recipient_list.append(director.id)
        if not recipient_list and self.email:
            recipient_list.append(self.id)
        recipient_ids = self.browse(recipient_list)
        res = ",".join(map(lambda x: str(x), recipient_ids.ids))
        return res

    def send_mail_adhesion(self):
        """
        Send mail adhésion to coop
        :return:
        """
        self.ensure_one()
        template_id = self.env.ref("cgscop_adhesion.email_template_adhesion")
        ir_model_data = self.env["ir.model.data"]
        try:
            compose_form_id = ir_model_data.get_object_reference(
                "mail", "email_compose_message_wizard_form"
            )[1]
        except ValueError:
            compose_form_id = False
        ctx = {
            "default_model": "res.partner",
            "default_res_id": self.id,
            "default_use_template": True,
            "default_template_id": template_id.id,
            "default_subtype_id": self.env.ref(
                "cgscop_adhesion_alfodoo.mail_message_subtype_adhesion"
            ).id,
            "default_composition_mode": "comment",
        }
        return {
            "type": "ir.actions.act_window",
            "view_type": "form",
            "view_mode": "form",
            "res_model": "mail.compose.message",
            "views": [(compose_form_id, "form")],
            "view_id": compose_form_id,
            "target": "new",
            "context": ctx,
        }

    def check_docs_adhesion(self):
        compulsory_docs = self.get_compulsory_docs()
        missing_docs = self.check_compulsory_docs()
        html = str()
        for doc in compulsory_docs:
            html += "<input type='checkbox'"
            if doc.name not in missing_docs:
                html += "checked"
            html += "/> " + doc.name + "<br/>"
        local_tz = timezone("Europe/Paris")
        utc_tz = timezone("UTC")
        html += (
            "<hr/>Vérifié le "
            + "<strong>"
            + utc_tz.localize(fields.Datetime.now())
            .astimezone(local_tz)
            .strftime("%d/%m/%Y à %-H:%M")
            + "</strong>"
        )
        self.log_missing_docs = html

    # ------------------------------------------------------
    # Business method
    # ------------------------------------------------------
    def get_compulsory_docs(self, type_process):
        domain = [
            ("coop_type_id", "=", self.cooperative_form_id.id),
            ("is_compulsory", "=", True),
            ("type_process", "=", type_process),
        ]

        return self.env["scop.adhesion.file"].search(domain)

    def scop_check_docs(self, type_process, error_type=""):
        """
        Return error message for mandatory documents
        :param str type_process: scop.adhesion.file type_process
        :param str error_type: scop.adhesion.file type_process
        """
        errors = str()
        compulsory_docs = self.get_compulsory_docs(type_process)
        loaded_docs = self.compulsory_doc_cmis_query()

        errors_complete_docs = self.check_compulsory_docs(
            compulsory_docs, loaded_docs)
        if errors_complete_docs:
            errors_str = str()
            for error in errors_complete_docs:
                errors_str += "<li>" + error + "</li>"
            errors += (
                "<hr/><strong>Documents manquants :</strong><ul>" + errors_str + "</ul>"
            )
        # Si des erreurs remplir les logs avec la liste des documents manquants
        if errors:
            local_tz = timezone("Europe/Paris")
            utc_tz = timezone("UTC")
            log_date = utc_tz.localize(
                fields.Datetime.now()).astimezone(local_tz).strftime("%d/%m/%Y %-H:%M")
            self.list_logs = "<strong>%s</strong> %s %s" % (
                log_date, error_type, errors
            )
        else:
            self.list_logs = False

    def check_compulsory_docs(self, compulsory_docs, loaded_docs):
        """
        Override function to check docs with cmis query
        :param obj compulsory_docs: scop.adhesion.file object
        :param list loaded_docs: cmis query response
        @returns list: list of missing mandatory documents
        """
        errors = list()

        compulsory_docs_list = compulsory_docs.mapped(
            lambda d: {"name": d.name, "metadata": d.type_doc}
        )
        loaded_docs_list = list(
            map(lambda d: d.properties.get("crm:type"), loaded_docs)
        )
        for mandatory_doc in compulsory_docs_list:
            if mandatory_doc.get("metadata") not in loaded_docs_list:
                errors.append(mandatory_doc.get("name"))

        return errors

    # ------------------------------------------------------
    # Override parent
    # ------------------------------------------------------
    def scop_valid_cg_button(self):
        """
        Inherit button to send mail
        """
        super(ScopAlfrescoAdhesionPartner, self).scop_valid_cg_button()
        return self.send_mail_adhesion()

    def scop_valid_cg(self):
        """
        Inherit function to push files on Alfresco :
        - Facture d'adhésion
        - Courrier d'adhésion
        """
        res = super(ScopAlfrescoAdhesionPartner, self).scop_valid_cg()
        if not self.partner_cmis_folder:
            folder_coop = self.create_cmis_folder()
        else:
            folder_coop = self.partner_cmis_folder

        # Create & store Facture d'adhésion
        invoice_file = self.env.ref("account.account_invoices")._render_qweb_pdf(
            self.invoice_adhesion_id.id
        )[0]
        invoice_name = "Facture d'Adhésion"
        self.push_alfresco_file(
            file=invoice_file,
            name=invoice_name + ".pdf",
            folder=folder_coop,
            metadata={
                "cm:title": invoice_name,
                "cmis:objectTypeId": "D:crm:document",
                "cmis:secondaryObjectTypeIds": [
                    "P:crm:organisme",
                    "P:cm:titled",
                ],
                "crm:type": "FAD",
                "crm:contexte": "STD",
                "crm:annee": str(fields.Datetime.now().year),
            },
        )

        # Create & store Courrier adhésion
        report_adhesion = self.env.ref(
            "cgscop_adhesion.cgscop_adhesion_report"
        )._render_qweb_pdf(self.id)[0]
        courrier_name = "Courrier d'Adhésion"
        self.push_alfresco_file(
            file=report_adhesion,
            name=courrier_name + ".pdf",
            folder=folder_coop,
            metadata={
                "cm:title": courrier_name,
                "cmis:objectTypeId": "D:crm:document",
                "cmis:secondaryObjectTypeIds": [
                    "P:crm:organisme",
                    "P:cm:titled",
                ],
                "crm:type": "CAD",
                "crm:contexte": "STD",
                "crm:annee": str(fields.Datetime.now().year),
            },
        )

        return res

    def scop_suivi_adhesion(self):
        """
        Inherit parent to check documents
        """
        # vérification des documents obligatoires
        self.scop_check_docs("project", "Impossible de créer la coopérative")

        return super(ScopAlfrescoAdhesionPartner, self).scop_suivi_adhesion()

    def scop_sumbit_cg(self):
        """
        Inherit parent to check documents
        """
        res = super(ScopAlfrescoAdhesionPartner, self).scop_sumbit_cg()
        # vérification des documents obligatoires
        self.scop_check_docs(
            "adhesion", "Impossible de transmettre le dossier d'adhésion"
        )
        return res

    # ------------------------------------------------------
    # Alfresco method
    # ------------------------------------------------------
    def compulsory_doc_cmis_query(self):
        self.ensure_one()
        backend = self.env["cmis.backend"].search([])
        backend.ensure_one()
        cmis_client = backend.get_cmis_client()
        query = (
            """
                    SELECT * FROM crm:document as d
                    JOIN crm:organisme as o ON d.cmis:objectId = o.cmis:objectId
                    WHERE o.crm:id = '%s'"""
            % self.id
        )
        try:
            doc = cmis_client.getDefaultRepository().query(query)
            result = doc.getResults()
            return result
        except Exception as e:
            raise UserError(
                _(
                    "Impossible de vérifier les documents d'adhésion"
                    " dans Alfresco : %s"
                )
                % e
            )