import "./global.css";

import { Toaster } from "@/components/ui/toaster";
import { createRoot } from "react-dom/client";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { AccountingLayout } from "./components/AccountingLayout";
import { InvoiceProvider } from "./contexts/InvoiceContext";
import { CustomerProvider } from "./contexts/CustomerContext";
import { PaymentProvider } from "./contexts/PaymentContext";
import { ReportProvider } from "./contexts/ReportContext";
import { ExpenseProvider } from "./contexts/ExpenseContext";
import { TransactionProvider } from "./contexts/TransactionContext";
import { AccountingProvider } from "./contexts/AccountingContext";
import { VendorProvider } from "./contexts/VendorContext";
import { PurchaseProvider } from "./contexts/PurchaseContext";
import { CashSaleProvider } from "./contexts/CashSaleContext";
import { QuotationProvider } from "./contexts/QuotationContext";
import { SettingsProvider } from "./contexts/SettingsContext";
import { CompanyProvider } from "./contexts/CompanyContext";
import { AuthProvider } from "./contexts/AuthContext";
import { AuthGuard } from "./components/AuthGuard";

const originalFetch = window.fetch;
window.fetch = async (...args) => {
  const [resource, config] = args;
  if (typeof resource === "string" && resource.startsWith("/api")) {
    const companyId = localStorage.getItem("companyId");
    const token = localStorage.getItem("token");
    const newConfig: any = config || {};
    newConfig.headers = {
      ...newConfig.headers,
    };
    if (companyId) {
      newConfig.headers["x-company-id"] = companyId;
    }
    if (token) {
      newConfig.headers["Authorization"] = `Bearer ${token}`;
    }
    return originalFetch(resource, newConfig);
  }
  return originalFetch(...args);
};


import Dashboard from "./pages/Dashboard";
import Quotations from "./pages/Quotations";
import Deliveries from "./pages/Deliveries";
import CashSales from "./pages/CashSales";
import Vendors from "./pages/Vendors";
import CreateVendor from "./pages/CreateVendor";
import EditVendor from "./pages/EditVendor";
import VendorDetail from "./pages/VendorDetail";
import Purchases from "./pages/Purchases";
import CreatePurchase from "./pages/CreatePurchase";
import EditPurchase from "./pages/EditPurchase";
import PurchaseDetail from "./pages/PurchaseDetail";
import Sales from "./pages/Sales";
import Customers from "./pages/Customers";
import CreateCustomer from "./pages/CreateCustomer";
import EditCustomer from "./pages/EditCustomer";
import CustomerDetail from "./pages/CustomerDetail";
import Payments from "./pages/Payments";
import CreatePayment from "./pages/CreatePayment";
import EditPayment from "./pages/EditPayment";
import PaymentDetail from "./pages/PaymentDetail";
import { Expenses } from "./pages/Expenses";
import { CreateExpense } from "./pages/CreateExpense";
import { EditExpense } from "./pages/EditExpense";
import { ExpenseDetail } from "./pages/ExpenseDetail";
import { Transactions } from "./pages/Transactions";
import { CreateTransaction } from "./pages/CreateTransaction";
import { EditTransaction } from "./pages/EditTransaction";
import { TransactionDetail } from "./pages/TransactionDetail";
import { Accounting } from "./pages/Accounting";
import { ChartOfAccounts } from "./pages/ChartOfAccounts";
import { CreateAccount } from "./pages/CreateAccount";
import { JournalEntries } from "./pages/JournalEntries";
import { CreateJournalEntry } from "./pages/CreateJournalEntry";
import { GeneralLedgerPage } from "./pages/GeneralLedgerPage";
import Reports from "./pages/Reports";
import FinancialReport from "./pages/FinancialReport";
import AnalyticsReport from "./pages/AnalyticsReport";
import ProfitLossYear from "./pages/ProfitLossYear";
import BalanceSheetYear from "./pages/BalanceSheetYear";
import { PlaceholderPage } from "./components/PlaceholderPage";
import Calendar from "./pages/Calendar";
import Settings from "./pages/Settings";
import Staff from "./pages/Staff";
import NotFound from "./pages/NotFound";
import Invoices from "./pages/Invoices";
import CreateInvoice from "./pages/CreateInvoice";
import InvoiceDetail from "./pages/InvoiceDetail";
import EditInvoice from "./pages/EditInvoice";
import CreateQuotation from "./pages/CreateQuotation";
import EditQuotation from "./pages/EditQuotation";
import QuotationDetail from "./pages/QuotationDetail";


import Login from "./pages/Login";
import Register from "./pages/Register";

const queryClient = new QueryClient();

const AppRoutes = () => (
  <Routes>
    <Route path="/login" element={<Login />} />
    <Route path="/register" element={<Register />} />
    
    <Route path="/" element={<AuthGuard><AccountingLayout><Dashboard /></AccountingLayout></AuthGuard>} />
    
    {/* Sales Module */}
    <Route path="/sales" element={<AuthGuard><AccountingLayout><Sales /></AccountingLayout></AuthGuard>} />
    <Route path="/quotations" element={<AuthGuard><AccountingLayout><Quotations /></AccountingLayout></AuthGuard>} />
    <Route path="/quotations/create" element={<AuthGuard><AccountingLayout><CreateQuotation /></AccountingLayout></AuthGuard>} />
    <Route path="/quotations/:id" element={<AuthGuard><AccountingLayout><QuotationDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/quotations/:id/edit" element={<AuthGuard><AccountingLayout><EditQuotation /></AccountingLayout></AuthGuard>} />

    <Route path="/deliveries" element={<AuthGuard><AccountingLayout><Deliveries /></AccountingLayout></AuthGuard>} />
    <Route path="/cash-sales" element={<AuthGuard><AccountingLayout><CashSales /></AccountingLayout></AuthGuard>} />
    
    {/* Invoice Module */}
    <Route path="/invoices" element={<AuthGuard><AccountingLayout><Invoices /></AccountingLayout></AuthGuard>} />
    <Route path="/invoices/create" element={<AuthGuard><AccountingLayout><CreateInvoice /></AccountingLayout></AuthGuard>} />
    <Route path="/invoices/:id" element={<AuthGuard><AccountingLayout><InvoiceDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/invoices/:id/edit" element={<AuthGuard><AccountingLayout><EditInvoice /></AccountingLayout></AuthGuard>} />
    
    {/* Customer Module */}
    <Route path="/customers" element={<AuthGuard><AccountingLayout><Customers /></AccountingLayout></AuthGuard>} />
    <Route path="/customers/create" element={<AuthGuard><AccountingLayout><CreateCustomer /></AccountingLayout></AuthGuard>} />
    <Route path="/customers/:id" element={<AuthGuard><AccountingLayout><CustomerDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/customers/:id/edit" element={<AuthGuard><AccountingLayout><EditCustomer /></AccountingLayout></AuthGuard>} />
    
    {/* Vendor Module */}
    <Route path="/vendors" element={<AuthGuard><AccountingLayout><Vendors /></AccountingLayout></AuthGuard>} />
    <Route path="/vendors/create" element={<AuthGuard><AccountingLayout><CreateVendor /></AccountingLayout></AuthGuard>} />
    <Route path="/vendors/:id" element={<AuthGuard><AccountingLayout><VendorDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/vendors/:id/edit" element={<AuthGuard><AccountingLayout><EditVendor /></AccountingLayout></AuthGuard>} />
    
    {/* Purchase Module */}
    <Route path="/purchases" element={<AuthGuard><AccountingLayout><Purchases /></AccountingLayout></AuthGuard>} />
    <Route path="/purchases/create" element={<AuthGuard><AccountingLayout><CreatePurchase /></AccountingLayout></AuthGuard>} />
    <Route path="/purchases/:id" element={<AuthGuard><AccountingLayout><PurchaseDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/purchases/:id/edit" element={<AuthGuard><AccountingLayout><EditPurchase /></AccountingLayout></AuthGuard>} />
    
    {/* Payments Module */}
    <Route path="/payments" element={<AuthGuard><AccountingLayout><Payments /></AccountingLayout></AuthGuard>} />
    <Route path="/payments/create" element={<AuthGuard><AccountingLayout><CreatePayment /></AccountingLayout></AuthGuard>} />
    <Route path="/payments/:id" element={<AuthGuard><AccountingLayout><PaymentDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/payments/:id/edit" element={<AuthGuard><AccountingLayout><EditPayment /></AccountingLayout></AuthGuard>} />
    
    {/* Expenses Module */}
    <Route path="/expenses" element={<AuthGuard><AccountingLayout><Expenses /></AccountingLayout></AuthGuard>} />
    <Route path="/expenses/create" element={<AuthGuard><AccountingLayout><CreateExpense /></AccountingLayout></AuthGuard>} />
    <Route path="/expenses/:id" element={<AuthGuard><AccountingLayout><ExpenseDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/expenses/:id/edit" element={<AuthGuard><AccountingLayout><EditExpense /></AccountingLayout></AuthGuard>} />
    
    {/* Reports Module */}
    <Route path="/reports" element={<AuthGuard><AccountingLayout><Reports /></AccountingLayout></AuthGuard>} />
    <Route path="/reports/:reportId" element={<AuthGuard><AccountingLayout><FinancialReport /></AccountingLayout></AuthGuard>} />
    <Route path="/reports/analytics/:reportId" element={<AuthGuard><AccountingLayout><AnalyticsReport /></AccountingLayout></AuthGuard>} />
    <Route path="/reports/profit-loss-year" element={<AuthGuard><AccountingLayout><ProfitLossYear /></AccountingLayout></AuthGuard>} />
    <Route path="/reports/balance-sheet-year" element={<AuthGuard><AccountingLayout><BalanceSheetYear /></AccountingLayout></AuthGuard>} />
    
    {/* Transactions Module */}
    <Route path="/transactions" element={<AuthGuard><AccountingLayout><Transactions /></AccountingLayout></AuthGuard>} />
    <Route path="/transactions/create" element={<AuthGuard><AccountingLayout><CreateTransaction /></AccountingLayout></AuthGuard>} />
    <Route path="/transactions/:id" element={<AuthGuard><AccountingLayout><TransactionDetail /></AccountingLayout></AuthGuard>} />
    <Route path="/transactions/:id/edit" element={<AuthGuard><AccountingLayout><EditTransaction /></AccountingLayout></AuthGuard>} />
    
    {/* Accounting Module */}
    <Route path="/accounting" element={<AuthGuard><AccountingLayout><Accounting /></AccountingLayout></AuthGuard>} />
    <Route path="/accounting/chart-of-accounts" element={<AuthGuard><AccountingLayout><ChartOfAccounts /></AccountingLayout></AuthGuard>} />
    <Route path="/accounting/chart-of-accounts/create" element={<AuthGuard><AccountingLayout><CreateAccount /></AccountingLayout></AuthGuard>} />
    <Route path="/accounting/journal-entries" element={<AuthGuard><AccountingLayout><JournalEntries /></AccountingLayout></AuthGuard>} />
    <Route path="/accounting/journal-entries/create" element={<AuthGuard><AccountingLayout><CreateJournalEntry /></AccountingLayout></AuthGuard>} />
    <Route path="/accounting/general-ledger" element={<AuthGuard><AccountingLayout><GeneralLedgerPage /></AccountingLayout></AuthGuard>} />
    
    {/* Other Routes */}
    <Route path="/calendar" element={<AuthGuard><AccountingLayout><Calendar /></AccountingLayout></AuthGuard>} />
    <Route path="/settings" element={<AuthGuard><AccountingLayout><Settings /></AccountingLayout></AuthGuard>} />
    <Route path="/staff" element={<AuthGuard><AccountingLayout><Staff /></AccountingLayout></AuthGuard>} />
    <Route path="*" element={<NotFound />} />


  </Routes>
);

const App = () => (
  <QueryClientProvider client={queryClient}>
    <AuthProvider>
      <CompanyProvider>
        <SettingsProvider>
          <VendorProvider>
        <PurchaseProvider>
        <CustomerProvider>
          <CashSaleProvider>
          <QuotationProvider>
            <InvoiceProvider>

            <PaymentProvider>
              <ExpenseProvider>
                <TransactionProvider>
                  <AccountingProvider>
                    <ReportProvider>
                      <Toaster />
                      <Sonner />
                      <BrowserRouter>
                        <AppRoutes />
                      </BrowserRouter>
                    </ReportProvider>
                  </AccountingProvider>
                </TransactionProvider>
              </ExpenseProvider>
            </PaymentProvider>
          </InvoiceProvider>
            </QuotationProvider>
          </CashSaleProvider>
        </CustomerProvider>
      </PurchaseProvider>
          </VendorProvider>
        </SettingsProvider>
      </CompanyProvider>
    </AuthProvider>
  </QueryClientProvider>
);

createRoot(document.getElementById("root")!).render(<App />);
