<?php

declare(strict_types=1);

error_reporting(E_ALL);
ini_set('display_errors', '1');

if (session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}


// ============================================================
// CORE
// ============================================================

require_once __DIR__ . '/../config/app.php';
require_once __DIR__ . '/../config/database.php';

require_once __DIR__ . '/../app/Helpers/auth.php';
require_once __DIR__ . '/../app/Helpers/permission.php';


// ============================================================
// REQUEST
// ============================================================

$page = strtolower(
    trim((string)($_GET['page'] ?? 'dashboard'))
);

$action = strtolower(
    trim((string)($_GET['action'] ?? 'index'))
);


// ============================================================
// CONTROLLER LOADER
// ============================================================

function loadController(string $controller): void
{
    $file = __DIR__ .
        '/../app/Controllers/' .
        $controller .
        '.php';

    if (!file_exists($file)) {

        throw new RuntimeException(
            "Controller file not found: {$controller}.php"
        );
    }

    require_once $file;

    if (!class_exists($controller)) {

        throw new RuntimeException(
            "Controller class not found: {$controller}"
        );
    }
}


// ============================================================
// ROUTER
// ============================================================

try {

    switch ($page) {

        // ====================================================
        // LOGIN
        // ====================================================

        case 'login':

            loadController('AuthController');

            if ($action === 'login') {

                AuthController::login();

            } elseif (
                method_exists(
                    'AuthController',
                    'index'
                )
            ) {

                AuthController::index();

            } elseif (
                method_exists(
                    'AuthController',
                    'showLogin'
                )
            ) {

                AuthController::showLogin();

            } else {

                $loginView =
                    __DIR__ .
                    '/../app/Views/auth/login.php';

                if (!file_exists($loginView)) {

                    throw new RuntimeException(
                        'Login view not found.'
                    );
                }

                require $loginView;
            }

            break;


        // ====================================================
        // LOGOUT
        // ====================================================

        case 'logout':

            loadController('AuthController');

            AuthController::logout();

            break;


        // ====================================================
        // DASHBOARD
        // ====================================================

        case 'dashboard':

            loadController('DashboardController');

            DashboardController::index();

            break;


        // ====================================================
        // USERS
        // ====================================================

        case 'users':

            loadController('UsersController');

            switch ($action) {

                case 'create':

                    UsersController::create();

                    break;

                case 'update':

                    UsersController::update();

                    break;

                case 'toggle_status':

                    UsersController::toggleStatus();

                    break;

                default:

                    UsersController::index();

                    break;
            }

            break;


        // ====================================================
        // ROLES
        // ====================================================

        case 'roles':

            loadController('RolesController');

            switch ($action) {

                case 'create':

                    RolesController::create();

                    break;

                case 'update':

                    RolesController::update();

                    break;

                case 'delete':

                    RolesController::delete();

                    break;

                default:

                    RolesController::index();

                    break;
            }

            break;


        // ====================================================
        // BRANCHES
        // ====================================================

        case 'branches':

            loadController('BranchesController');

            switch ($action) {

                case 'create':

                    BranchesController::create();

                    break;

                case 'update':

                    BranchesController::update();

                    break;

                case 'delete':

                    BranchesController::delete();

                    break;

                default:

                    BranchesController::index();

                    break;
            }

            break;


        // ====================================================
        // PRODUCTS
        // ====================================================

        case 'products':

            loadController('ProductsController');

            switch ($action) {

                case 'create':

                    ProductsController::create();

                    break;

                case 'update':

                    ProductsController::update();

                    break;

                case 'delete':

                    ProductsController::delete();

                    break;

                default:

                    ProductsController::index();

                    break;
            }

            break;
// ============================================================
// CATEGORIES
// ============================================================

case 'categories':

    require_once
        __DIR__ .
        '/../app/Controllers/CategoriesController.php';

    switch ($action) {

        case 'category-create':
            CategoriesController::create();
            break;

        case 'update':
            CategoriesController::update();
            break;

        case 'delete':
            CategoriesController::delete();
            break;

        case 'toggle_status':
            CategoriesController::toggleStatus();
            break;

        default:
            CategoriesController::index();
            break;
    }

    break;
// ====================================================
// CUSTOMERS
// ====================================================

case 'customers':

    loadController('CustomersController');

    switch ($action) {

        // ------------------------------------------------
        // CUSTOMER LIST
        // ------------------------------------------------

        case 'index':
        case 'list':

            CustomersController::index();

            break;


        // ------------------------------------------------
        // CREATE CUSTOMER
        // ------------------------------------------------

        case 'create':
        case 'customer-create':

            CustomersController::create();

            break;


        // ------------------------------------------------
        // UPDATE CUSTOMER
        // ------------------------------------------------

        case 'update':
        case 'edit':

            CustomersController::update();

            break;


        // ------------------------------------------------
        // DELETE CUSTOMER
        // ------------------------------------------------

        case 'delete':

            CustomersController::delete();

            break;


        // ------------------------------------------------
        // TOGGLE STATUS
        // ------------------------------------------------

        case 'toggle_status':
        case 'togglestatus':

            CustomersController::toggleStatus();

            break;


        // ------------------------------------------------
        // CUSTOMER LEDGER
        // ------------------------------------------------

        case 'ledger':
        case 'customer-ledger':

            CustomersController::ledger();

            break;


        // ------------------------------------------------
        // RECEIVE PAYMENT
        // ------------------------------------------------

        case 'receivepayment':
        case 'receive_payment':
        case 'payment':

            CustomersController::receivePayment();

            break;


        // ------------------------------------------------
        // PAYMENT RECEIPT
        // ------------------------------------------------

        case 'paymentreceipt':
        case 'payment-receipt':
        case 'customer-payment-receipt':

            CustomersController::paymentReceipt();

            break;


        // ------------------------------------------------
        // PAYMENT RECEIPT PDF / PRINT
        // ------------------------------------------------

        case 'paymentreceiptpdf':
        case 'payment-receipt-pdf':
        case 'customer-payment-receipt-pdf':

            CustomersController::paymentReceiptPdf();

            break;


        // ------------------------------------------------
        // CUSTOMER LEDGER PDF / PRINT
        // ------------------------------------------------

        case 'ledgerpdf':
        case 'ledger-pdf':
        case 'customer-ledger-pdf':

            CustomersController::ledgerPdf();

            break;


        // ------------------------------------------------
        // DEFAULT
        // ------------------------------------------------

        default:

            CustomersController::index();

            break;
    }

    break;
        // ====================================================
        // SALES
        // ====================================================

        case 'sales':

            loadController('SalesController');

            switch ($action) {

                case 'create':
                case 'createsale':

                    SalesController::createSale();

                    break;


                case 'sale':
                case 'view':

                    SalesController::sale();

                    break;


                case 'list':
                case 'sales':

                    SalesController::sales();

                    break;


                case 'branches':

                    SalesController::branches();

                    break;


                case 'customers':

                    SalesController::customers();

                    break;


                case 'customer':

                    SalesController::customer();

                    break;


                case 'products':

                    SalesController::products();

                    break;


                case 'product':

                    SalesController::product();

                    break;


                case 'returnable':
                case 'returnableitems':

                    SalesController::returnableItems();

                    break;


                case 'return':
                case 'createreturn':

                    SalesController::createReturn();

                    break;


                case 'receipt':

                    SalesController::receipt();

                    break;


                case 'returnreceipt':

                    SalesController::returnReceipt();

                    break;


                case 'customerbalance':
                case 'balance':

                    $customerId =
                        (int)(
                            $_GET['customer_id']
                            ?? $_POST['customer_id']
                            ?? 0
                        );

                    if ($customerId <= 0) {

                        throw new RuntimeException(
                            'Customer ID is required.'
                        );
                    }

                    $balance =
                        SalesController::getCustomerBalance(
                            $customerId
                        );

                    SalesController::json([
                        'success' => true,
                        'data' => [
                            'customer_id' =>
                                $customerId,
                            'current_balance' =>
                                $balance
                        ]
                    ]);

                    break;


                default:

                    SalesController::index();

                    break;
            }

            break;


        // ====================================================
        // SUPPLIERS
        // ====================================================

        case 'suppliers':

            loadController('SuppliersController');

            switch ($action) {

                case 'create':

                    SuppliersController::create();

                    break;

                case 'update':

                    SuppliersController::update();

                    break;

                case 'delete':

                    SuppliersController::delete();

                    break;

                default:

                    SuppliersController::index();

                    break;
            }

            break;


        // ====================================================
        // PURCHASES
        // ====================================================

        case 'purchases':

            loadController('PurchasesController');

            switch ($action) {

                case 'create':

                    PurchasesController::create();

                    break;

                case 'update':

                    PurchasesController::update();

                    break;

                case 'delete':

                    PurchasesController::delete();

                    break;

                default:

                    PurchasesController::index();

                    break;
            }

            break;


        // ====================================================
        // STOCK TRANSFER
        // ====================================================

        case 'stocktransfer':
        case 'stock_transfer':
        case 'transfers':

            loadController('StockTransferController');

            switch ($action) {

                case 'create':

                    StockTransferController::create();

                    break;

                case 'approve':

                    StockTransferController::approve();

                    break;

                case 'receive':

                    StockTransferController::receive();

                    break;

                case 'view':

                    StockTransferController::view();

                    break;

                default:

                    StockTransferController::index();

                    break;
            }

            break;


        // ====================================================
        // STOCK
        // ====================================================

        case 'stock':

            loadController('StockController');

            switch ($action) {

                case 'adjust':

                    StockController::adjust();

                    break;

                default:

                    StockController::index();

                    break;
            }

            break;


        // ====================================================
        // INVENTORY
        // ====================================================

        case 'inventory':

            loadController('InventoryController');

            switch ($action) {

                case 'adjust':

                    InventoryController::adjust();

                    break;

                default:

                    InventoryController::index();

                    break;
            }

            break;


        // ====================================================
        // REPORTS
        // ====================================================

        case 'reports':

            loadController('ReportsController');

            switch ($action) {

                default:

                    ReportsController::index();

                    break;
            }

            break;


        // ====================================================
        // 404
        // ====================================================

        default:

            http_response_code(404);

            echo '
                <!DOCTYPE html>
                <html>
                <head>
                    <meta charset="UTF-8">
                    <title>404 - POS Lite</title>
                </head>
                <body>
                    <h1>404 - Page Not Found</h1>
                    <p>The requested page does not exist.</p>
                </body>
                </html>
            ';

            break;
    }


} catch (Throwable $e) {

    http_response_code(500);

    echo '<!DOCTYPE html>';
    echo '<html>';
    echo '<head>';
    echo '<meta charset="UTF-8">';
    echo '<title>POS Lite Error</title>';

    echo '<style>
        body {
            font-family: Arial, sans-serif;
            background: #f5f5f5;
            padding: 30px;
        }

        .error {
            max-width: 900px;
            margin: auto;
            background: white;
            border: 1px solid #dc3545;
            border-radius: 8px;
            padding: 25px;
        }

        h1 {
            color: #dc3545;
        }

        pre {
            background: #f1f1f1;
            padding: 15px;
            overflow-x: auto;
            white-space: pre-wrap;
        }
    </style>';

    echo '</head>';
    echo '<body>';

    echo '<div class="error">';

    echo '<h1>POS Lite Error</h1>';

    echo '<p><strong>Message:</strong></p>';

    echo '<pre>';

    echo htmlspecialchars(
        $e->getMessage(),
        ENT_QUOTES,
        'UTF-8'
    );

    echo '</pre>';

    echo '<p><strong>File:</strong></p>';

    echo '<pre>';

    echo htmlspecialchars(
        $e->getFile(),
        ENT_QUOTES,
        'UTF-8'
    );

    echo '</pre>';

    echo '<p><strong>Line:</strong> ';
    echo (int)$e->getLine();
    echo '</p>';

    echo '<p><strong>Trace:</strong></p>';

    echo '<pre>';

    echo htmlspecialchars(
        $e->getTraceAsString(),
        ENT_QUOTES,
        'UTF-8'
    );

    echo '</pre>';

    echo '</div>';

    echo '</body>';
    echo '</html>';

    exit;
}