/* @odoo-module */

import { patch } from "@web/core/utils/patch";
import { MockServer } from "@web/../tests/helpers/mock_server";

patch(MockServer.prototype, {
    async _performRPC(route, args) {
        if (args.model === "ir.attachment" && args.method === "register_as_main_attachment") {
            const ids = args.args[0];
            return this._mockIrAttachmentRegisterAsMainAttachment(ids);
        }
        return super._performRPC(route, args);
    },
    /**
     * Simulates `_attachment_format` on `ir.attachment`.
     *
     * @private
     * @param {integer} ids
     * @returns {Object}
     */
    _mockIrAttachment_attachmentFormat(ids) {
        const attachments = this.mockRead("ir.attachment", [ids]);
        return attachments.map((attachment) => {
            const res = {
                create_date: attachment.create_date,
                checksum: attachment.checksum,
                filename: attachment.name,
                id: attachment.id,
                mimetype: attachment.mimetype,
                name: attachment.name,
                size: attachment.file_size,
            };
            res["originThread"] = [
                [
                    "ADD",
                    {
                        id: attachment.res_id,
                        model: attachment.res_model,
                    },
                ],
            ];
            const voice = this.getRecords("discuss.voice.metadata", [
                ["attachment_id", "=", attachment.id],
            ])[0];
            if (voice) {
                res.voice = true;
            }
            return res;
        });
    },
    /**
     * Simulates `register_as_main_attachment` on `ir.attachment`.
     *
     * @private
     * @param {integer} ids
     * @param {boolean} [force=true]
     * @returns {boolean} dummy value for mock server
     */
    _mockIrAttachmentRegisterAsMainAttachment(ids, force = true) {
        const [attachment] = this.getRecords("ir.attachment", [["id", "in", ids]]);
        if (!attachment.res_model) {
            return true; // dummy value for mock server
        }
        if (!this.models[attachment.res_model].fields["message_main_attachment_id"]) {
            return true; // dummy value for mock server
        }
        const [record] = this.pyEnv[attachment.res_model].searchRead([
            ["id", "=", attachment.res_id],
        ]);
        if (force || !record.message_main_attachment_id) {
            this.pyEnv[attachment.res_model].write([record.id], {
                message_main_attachment_id: attachment.id,
            });
        }
        return true; // dummy value for mock server
    },
});
