/** @odoo-module **/

import { editInput, getFixture, patchWithCleanup } from "@web/../tests/helpers/utils";
import { makeView, setupViewRegistries } from "@web/../tests/views/helpers";

let target;
let serverData;

QUnit.module("Widgets", (hooks) => {
    hooks.beforeEach(() => {
        target = getFixture();
        serverData = {
            models: {
                partner: {
                    fields: {
                        display_name: { string: "Displayed name", type: "char" },
                        type: { string: "Type", type: "char"}
                    },
                    records: [
                        {
                            id: 7,
                            display_name: "first record",
                            type: "purchase",
                        },
                    ],
                    onchanges: {},
                },
            },
            views: {
                "partner,false,form": `<form>
                        <widget name="account_file_uploader"/>
                        <field name="display_name" required="1"/>
                    </form>`,
                "partner,false,list": `<list>
                        <field name="id"/>
                        <field name="display_name"/>
                    </list>`,
                "partner,false,search": `<search/>`,
            },
        };

        setupViewRegistries();
    });

    QUnit.module("AccountFileUploader");

    QUnit.test("widget contains context based on the record despite field not in view", async function (assert) {

        const form = await makeView({
            type: "form",
            resModel: "partner",
            serverData,
            resId: 7,
            mockRPC(route, args) {
                if (args.method === "create") {
                    assert.deepEqual(args.model, "ir.attachment", "create ir.attachment")
                    return [99];
                }
                if (args.method === "create_document_from_attachment" && args.model === "account.journal") {
                    assert.equal(args.kwargs.context.default_journal_id, 7, "create documents in correct journal");
                    assert.equal(args.kwargs.context.default_move_type, "in_invoice", "create documents with correct move type");
                    return {
                        'name': 'Generated Documents',
                        'domain': [],
                        'res_model': 'partner',
                        'type': 'ir.actions.act_window',
                        'context': {},
                        'views': [[false, "list"], [false, "form"]],
                        'view_mode': 'list, form',
                    }
                }
            },
        });
        patchWithCleanup(form.env.services.action, {
            doAction(action) {
                assert.equal(action.type, "ir.actions.act_window", "do action after documents created");
            }
        });

        assert.expect(5);
        assert.containsOnce(target, '.o_widget_account_file_uploader');
        const file = new File(["test"], "fake_file.txt", { type: "text/plain" });
        await editInput(target, ".o_input_file", file);
        
    });

    QUnit.module("AccountMoveUploadKanbanView");

    QUnit.test("can render AccountMoveUploadKanbanView", async function (assert) {
        serverData.views["partner,false,kanban"] = `
            <kanban js_class="account_documents_kanban">
                <templates>
                    <t t-name="card">
                        <field name="display_name"/>
                    </t>
                </templates>
            </kanban>`;
        await makeView({
            type: "kanban",
            resModel: "partner",
            serverData,
            mockRPC(route, args) {
                if (args.method === "search_read" && args.model === "res.company") {
                    return [{ id: 1, country_code: 'US'}];
                }
            },
        });

        assert.containsOnce(target, ".o_control_panel .o_button_upload_bill:visible");
        assert.containsOnce(target, ".o_kanban_record:not(.o_kanban_ghost)");
    });
});
