import unittest
from pathlib import Path


ROOT = Path(__file__).resolve().parents[2]


def source(path: str) -> str:
    return (ROOT / path).read_text(encoding="utf-8")


class InvoiceFrontendCrudTests(unittest.TestCase):
    def test_invoice_list_exposes_create_update_delete_controls(self) -> None:
        page = source("frontend/src/pages/InvoicesPage.vue")

        self.assertIn("ConfirmDialog", page)
        self.assertIn("function openAdd", page)
        self.assertIn("function openEdit", page)
        self.assertIn("function confirmDelete", page)
        self.assertIn("invoicesApi.create", page)
        self.assertIn("invoicesApi.update", page)
        self.assertIn("invoicesApi.delete", page)
        self.assertIn("customersApi.list", page)
        self.assertIn("customersApi.list({ page: 1, page_size: 100 })", page)
        self.assertIn("productsApi.list", page)

    def test_invoice_detail_uses_backend_customer_shape_and_payment_endpoint(self) -> None:
        detail_page = source("frontend/src/pages/InvoiceDetailPage.vue")
        api = source("frontend/src/api/invoices.js")

        self.assertIn("customerName", detail_page)
        self.assertIn("/payments", api)
        self.assertNotIn("/record-payment", api)

    def test_invoice_detail_keeps_send_action_available_after_first_send(self) -> None:
        detail_page = source("frontend/src/pages/InvoiceDetailPage.vue")
        invoices_api = source("backend/app/api/invoices.py")

        self.assertIn("status === 'sent' || status === 'partially_paid'", detail_page)
        self.assertIn("fn: send", detail_page)
        self.assertIn("label: '再次发送'", detail_page)
        self.assertIn("const success = ref('')", detail_page)
        self.assertIn("success.value = message", detail_page)
        self.assertIn("付款方式可在“发票与系统设置”中自定义", detail_page)
        self.assertIn("InvoiceStatus.sent", invoices_api)
        self.assertIn("InvoiceStatus.partially_paid", invoices_api)
        self.assertIn("await send_email(", invoices_api)
        self.assertIn("EmailLog(", invoices_api)
        self.assertIn("SMTP not configured", invoices_api)
        self.assertIn('"filename": f"{invoice.invoice_number}.pdf"', invoices_api)
        self.assertIn('filename="{invoice.invoice_number}.pdf"', invoices_api)


if __name__ == "__main__":
    unittest.main()
