const request = require('supertest');
const app = require('../../app'); // Impor aplikasi Express utama Anda
const db = require('../../models');
const fs = require('fs');
const path = require('path');

describe('PDF Generation Integration Test', () => {
    let createdPdfPath; // Untuk menyimpan path PDF yang dibuat agar bisa dihapus

    // Sebelum semua test di file ini berjalan
    beforeAll(async () => {
        // Sinkronkan database test, `force: true` akan menghapus semua tabel dan membuatnya kembali
        // Ini memastikan setiap test run dimulai dengan database yang bersih
        await db.sequelize.sync({ force: true });
    });

    // Setelah setiap test selesai
    afterEach(() => {
        // Hapus file PDF yang telah dibuat untuk membersihkan
        if (createdPdfPath && fs.existsSync(createdPdfPath)) {
            fs.unlinkSync(createdPdfPath);
            createdPdfPath = null;
        }
    });

    // Setelah semua test di file ini selesai
    afterAll(async () => {
        // Tutup koneksi database
        await db.sequelize.close();
    });

    it('should generate a PDF, save it to disk, and update the database', async () => {
        // 1. Arrange: Siapkan data yang akan dikirim
        const invoiceData = {
            client_name: "Real Client",
            client_phone: "0895355389559",
            client_address: "Jl. Uji Coba No. 1",
            inv_id: "INT-TEST-001",
            inv_status: "Paid",
            inv_date: "Kamis, 23 Mei 2024",
            inv_duedate: "Sabtu, 01 Juni 2024",
            sub_total: "200000",
            total: "222000",
            ppn: "22000",
            credit: "0",
            balance: "222000",
            company: {
                name: "PT. Semut Data Indonesia",
                address: "Ruko Amparan Jati Blok A No.06, Margajaya, Bogor Barat",
                phone: "0251 8471670",
                whatsapp: "+62 811 1185 911"
            },
            items: [{ id: 99, description: "Integration Test Service", amount: "200000" }],
            transaction: []
        };

        // Buat record invoice palsu di DB agar `update` bisa berhasil
        await db.invoice.create({
            inv_id: invoiceData.inv_id,
            inv_name: invoiceData.client_name,
            // ... properti lain yang dibutuhkan
        });

        // 2. Act: Kirim request HTTP sungguhan ke endpoint
        const response = await request(app)
            .post('/pdf/generate-manual') // Sesuaikan dengan route Anda di app.js
            .send(invoiceData);

        try {
            // 3. Assert: Verifikasi semua hasil
            
            // a. Verifikasi Respons API
            expect(response.status).toBe(200);
            expect(response.body.status).toBe(true);
            expect(response.body.pdfPath).toBeDefined();
            expect(response.body.pdfPath).toContain(invoiceData.inv_id);

            // b. Verifikasi File Fisik di Server
            const relativePath = response.body.pdfPath;
            const absolutePath = path.join(__dirname, '../../public', relativePath);
            createdPdfPath = absolutePath; // Simpan path untuk dihapus nanti
            
            expect(fs.existsSync(absolutePath)).toBe(true);

            // c. Verifikasi Database
            const updatedInvoice = await db.invoice.findOne({ where: { inv_id: invoiceData.inv_id } });
            expect(updatedInvoice).not.toBeNull();
            expect(updatedInvoice.pdfCreated).toBe(true);
            expect(updatedInvoice.pdfName).toEqual(relativePath);
        } catch (error) {
            // Jika ada assertion yang gagal, cetak body respons untuk debugging
            console.error('Test failed. Response body:', JSON.stringify(response.body, null, 2));
            // Lempar kembali error agar test tetap ditandai gagal
            throw error;
        }
    }, 15000); // Tambahkan timeout lebih lama karena ini operasi I/O
});
