<?php
/**
 * Demo کامل خدمات میدانی — داده تستی از ثبت تا پرداخت
 * http://localhost/acc-engine/run-service-demo.php
 *
 * C:\xampp\php\php.exe C:\xampp\htdocs\acc-engine\run-service-demo.php
 */
declare(strict_types=1);

define( 'ACC_BASE_PATH', __DIR__ );
define( 'ACC_PATH', __DIR__ . '/' );
define( 'ABSPATH', __DIR__ . '/' );
define( 'ACC_URL', '/acc-engine/' );

require_once __DIR__ . '/standalone/bootstrap.php';
require_once ACC_PATH . 'includes/controllers/SR_Controller.php';
require_once ACC_PATH . 'includes/helpers/service-report-render.php';

/** @var wpdb $wpdb */
global $wpdb;

function demo_req( string $method, array $json = [], array $url = [] ): array {
    $req = new WP_REST_Request( $method );
    $req->set_json_params( $json );
    $req->set_url_params( $url );
    return [ 'req' => $req, 'json' => $json, 'url' => $url ];
}

function demo_data( WP_REST_Response $res ): array {
    $d = $res->get_data();
    return is_array( $d ) ? $d : [ 'raw' => $d ];
}

function demo_step( string $title, callable $fn ): array {
    try {
        $out = $fn();
        return [ 'ok' => true, 'title' => $title, 'data' => $out ];
    } catch ( Throwable $e ) {
        return [ 'ok' => false, 'title' => $title, 'error' => $e->getMessage() ];
    }
}

$log   = [];
$base  = rtrim( ACC_URL, '/' );
$demo  = [
    'customer' => [
        'name'    => 'آقای حسین کریمی',
        'company' => 'رستوران سفره ایرانی',
        'phone'   => '09121234567',
        'email'   => 'demo@safarhe-irani.test',
        'address' => 'تهران، خیابان ولیعصر، پلاک ۱۲۴۵',
        'site'    => 'سردخانه زیرزمین — آشپزخانه اصلی',
    ],
    'device' => [
        'device_type'      => 'سردخانه صنعتی',
        'brand'            => 'Carrier',
        'model'            => '30RT',
        'serial_no'        => 'CR-DEMO-2020-8891',
        'capacity'         => '30 تن',
        'refrigerant'      => 'R404A',
        'install_location' => 'زیرزمین — کنار دیوار شمالی',
        'estimated_value'  => 850000000,
    ],
    'complaint' => 'کمپرسور هر ۲ ساعت خاموش می‌شود. مصرف برق بالا رفته و دمای داخل تا ۸ درجه بالا می‌آید.',
    'tags'      => [ 'خاموش شدن کمپرسور', 'مصرف برق بالا' ],
];

$session_key = 'demo_' . date( 'Ymd_His' );

// ── ۱. مشتری — ثبت درخواست از ویجت ──
    $step1 = demo_step( '۱. ثبت درخواست مشتری (ویجت)', function () use ( $demo, $session_key ) {
    [ 'req' => $req ] = demo_req( 'POST', [
        'session_key'      => $session_key,
        'name'             => $demo['customer']['name'],
        'company'          => $demo['customer']['company'],
        'phone'            => $demo['customer']['phone'],
        'email'            => $demo['customer']['email'],
        'address'          => $demo['customer']['address'],
        'site_label'       => $demo['customer']['site'],
        'service_type'     => 'repair',
        'complaint_text'   => $demo['complaint'],
        'complaint_tags'   => $demo['tags'],
        'device_type'      => $demo['device']['device_type'],
        'brand'            => $demo['device']['brand'],
        'model'            => $demo['device']['model'],
        'serial_no'        => $demo['device']['serial_no'],
        'capacity'         => $demo['device']['capacity'],
        'refrigerant'      => $demo['device']['refrigerant'],
        'install_location' => $demo['device']['install_location'],
    ] );
    $res = SR_Controller::visitor_create_request( $req );
    $data = demo_data( $res );
    if ( empty( $data['success'] ) ) {
        throw new RuntimeException( $data['message'] ?? 'خطا در ثبت درخواست' );
    }
    return $data['data'];
} );
$log[] = $step1;
if ( ! $step1['ok'] ) {
    goto render;
}

$request_id      = (int) $step1['data']['id'];
$tracking_code   = $step1['data']['tracking_code'];
$request_no      = $step1['data']['request_no'] ?? '';
$conversation_id = (int) ( $step1['data']['conversation_id'] ?? 0 );
$device_id       = (int) ( $wpdb->get_var( $wpdb->prepare(
    "SELECT device_id FROM {$wpdb->prefix}svc_requests WHERE id = %d", $request_id
) ) ?: 0 );

// ارزش تخمینی دستگاه
if ( $device_id ) {
    $wpdb->update( "{$wpdb->prefix}svc_devices", [
        'estimated_value' => $demo['device']['estimated_value'],
        'updated_at'      => current_time( 'mysql' ),
    ], [ 'id' => $device_id ] );
}

// کارشناس
$tech_id = (int) ( $wpdb->get_var( "SELECT ID FROM {$wpdb->users} ORDER BY ID ASC LIMIT 1" ) ?: 1 );
$tech_name = $wpdb->get_var( $wpdb->prepare(
    "SELECT display_name FROM {$wpdb->users} WHERE ID = %d", $tech_id
) ) ?: 'کارشناس ۱';

$scheduled = date( 'Y-m-d H:i:s', strtotime( '+1 day 10:00' ) );

// ── ۲. Dispatch — تخصیص کارشناس ──
$step2 = demo_step( '۲. Dispatch — تخصیص کارشناس', function () use ( $request_id, $tech_id, $scheduled ) {
    [ 'req' => $req ] = demo_req( 'POST', [
        'technician_id'  => $tech_id,
        'status'         => 'assigned',
        'scheduled_at'   => $scheduled,
        'dispatch_notes' => 'اولویت بالا — مشتری VIP. قطعه رله احتمالاً نیاز است.',
    ], [ 'id' => $request_id ] );
    $res  = SR_Controller::assign_request( $req );
    $data = demo_data( $res );
    return array_merge( $data['data'] ?? $data, [ 'technician_id' => $tech_id ] );
} );
$log[] = $step2;

// ── ۳. شروع کار میدانی ──
$step3 = demo_step( '۳. شروع کار میدانی (in_progress)', function () use ( $request_id ) {
    [ 'req' => $req ] = demo_req( 'PUT', [ 'status' => 'in_progress' ], [ 'id' => $request_id ] );
    $res = SR_Controller::update_request( $req );
    return demo_data( $res )['data'] ?? [];
} );
$log[] = $step3;

// ── ۴. ایجاد گزارش SRD ──
$step4 = demo_step( '۴. ایجاد گزارش فنی SRD', function () use ( $request_id ) {
    [ 'req' => $req ] = demo_req( 'POST', [ 'request_id' => $request_id ] );
    $res  = SR_Controller::create_report( $req );
    $data = demo_data( $res );
    if ( empty( $data['success'] ) ) {
        throw new RuntimeException( 'ایجاد گزارش ناموفق' );
    }
    return $data['data'];
} );
$log[] = $step4;
if ( ! $step4['ok'] ) {
    goto render;
}

$report_id    = (int) $step4['data']['id'];
$report_no    = $step4['data']['report_no'];
$public_token = $step4['data']['public_token'];

// ── ۵. تکمیل ۱۳ مرحله SRD + مالی ──
$srd_payload = [
    'service_type'       => 'repair',
    'customer_name'      => $demo['customer']['name'],
    'company'            => $demo['customer']['company'],
    'phone'              => $demo['customer']['phone'],
    'email'              => $demo['customer']['email'],
    'address'            => $demo['customer']['address'],
    'site_label'         => $demo['customer']['site'],
    'complaint_text'     => $demo['complaint'],
    'complaint_tags'     => $demo['tags'],
    'diagnosis_result'   => 'رله اورلود کمپرسور ضعیف شده و باعث قطع مکرر مدار شده است. فشار سuction در حد مجاز است.',
    'technical_readings' => [
        'suction_bar'    => 2.1,
        'discharge_bar'  => 14.8,
        'room_temp_c'    => -18,
        'ambient_temp_c' => 32,
        'compressor_amp' => 28.5,
    ],
    'service_lines' => [
        [ 'title' => 'عیب‌یابی و بازدید', 'qty' => 1, 'unit_price' => 2500000, 'total' => 2500000 ],
        [ 'title' => 'تعویض رله اورلود', 'qty' => 1, 'unit_price' => 1500000, 'total' => 1500000 ],
    ],
    'part_lines' => [
        [ 'title' => 'رله اورلود Carrier 30RT', 'qty' => 1, 'unit_price' => 3200000, 'total' => 3200000, 'sku' => 'DEMO-RLY-001' ],
    ],
    'material_lines' => [
        [ 'title' => 'گاز R404A (۱ کیلو)', 'qty' => 1, 'unit_price' => 850000, 'total' => 850000 ],
    ],
    'extra_costs' => [
        [ 'title' => 'ایاب‌ذهاب', 'amount' => 450000 ],
    ],
    'recommendations' => [
        'پس از ۳ ماه سرویس دوره‌ای انجام شود.',
        'فیلتر dryer را در بازدید بعدی تعویض کنید.',
    ],
    'pm_offer' => [ 'plan' => 'quarterly', 'selected' => true ],
    'subtotal_services'  => 4000000,
    'subtotal_parts'     => 3200000,
    'subtotal_materials' => 850000,
    'subtotal_extra'     => 450000,
    'discount'           => 500000,
    'tax'                => 720000,
    'total'              => 8720000,
    'paid'               => 2000000,
    'balance'            => 6720000,
    'tech_signature'     => 'کارشناس: ' . $tech_name,
    'customer_signature' => 'امضای مشتری: حسین کریمی',
    'report_date'        => current_time( 'Y-m-d' ),
    'warehouse_id'       => 0,
];

$step5 = demo_step( '۵. ذخیره محتوای SRD (۱۳ مرحله)', function () use ( $report_id, $srd_payload ) {
    [ 'req' => $req ] = demo_req( 'PUT', $srd_payload, [ 'id' => $report_id ] );
    $res = SR_Controller::save_report( $req );
    $data = demo_data( $res );
    return [
        'report_id' => $report_id,
        'total'     => $srd_payload['total'],
        'balance'   => $srd_payload['balance'],
        'saved'     => $data['success'] ?? true,
    ];
} );
$log[] = $step5;

// ── ۶. Finalize ──
$step6 = demo_step( '۶. نهایی‌سازی گزارش (Finalize)', function () use ( $report_id, $srd_payload ) {
    [ 'req' => $req ] = demo_req( 'POST', array_merge( $srd_payload, [ 'warehouse_id' => 0 ] ), [ 'id' => $report_id ] );
    $res  = SR_Controller::finalize_report( $req );
    $data = demo_data( $res );
    if ( empty( $data['success'] ) ) {
        throw new RuntimeException( $data['message'] ?? 'Finalize ناموفق' );
    }
    $row = $data['data'] ?? [];
    return [
        'report_no'    => $row['report_no'] ?? '',
        'public_token' => $row['public_token'] ?? '',
        'public_url'   => $row['public_url'] ?? Service_Report_Render::public_url( $row['public_token'] ?? '' ),
        'total'        => $row['total'] ?? 0,
        'balance'      => $row['balance'] ?? 0,
    ];
} );
$log[] = $step6;

// ── ۷. پیگیری مشتری ──
$step7 = demo_step( '۷. پیگیری مشتری (visitor track)', function () use ( $tracking_code, $base ) {
    [ 'req' => $req ] = demo_req( 'GET', [], [ 'code' => $tracking_code ] );
    $res  = SR_Controller::visitor_track( $req );
    $data = demo_data( $res );
    if ( empty( $data['success'] ) ) {
        throw new RuntimeException( $data['message'] ?? 'پیگیری ناموفق' );
    }
    $row = $data['data'];
    return [
        'tracking_code' => $row['tracking_code'],
        'status'        => $row['status_label'],
        'timeline'      => $row['timeline'] ?? [],
        'payment'       => $row['payment'] ?? null,
        'pay_url'       => $base . '/service-pay.php?token=' . ( $row['payment']['public_token'] ?? '' ),
    ];
} );
$log[] = $step7;

// ── ۸. قرارداد PM ──
$step8 = demo_step( '۸. قرارداد PM', function () {
    $req = demo_req( 'GET' )['req'];
    $res = SR_Controller::list_pm_contracts( $req );
    $rows = demo_data( $res )['data'] ?? [];
    return [ 'contracts' => array_slice( $rows, 0, 3 ) ];
} );
$log[] = $step8;

// ── ۹. نمودار هزینه دستگاه ──
if ( $device_id ) {
    $step9 = demo_step( '۹. نمودار هزینه دستگاه', function () use ( $device_id ) {
        [ 'req' => $req ] = demo_req( 'GET', [], [ 'id' => $device_id ] );
        $res  = SR_Controller::device_cost_chart( $req );
        $data = demo_data( $res )['data'] ?? [];
        return [
            'device_id'         => $device_id,
            'lifetime_cost'     => $data['lifetime_cost'] ?? 0,
            'estimated_value'   => $data['estimated_value'] ?? 0,
            'replace_suggested' => $data['replace_suggested'] ?? false,
            'monthly'           => $data['monthly'] ?? [],
        ];
    } );
    $log[] = $step9;
}

// ── ۱۰. داشبورد ──
$step10 = demo_step( '۱۰. داشبورد ERP', function () {
    $req = demo_req( 'GET' )['req'];
    $res = SR_Controller::dashboard( $req );
    return demo_data( $res )['data'] ?? [];
} );
$log[] = $step10;

// ── ۱۱. یادآوری PM (نمونه) — قرارداد با تاریخ امروز ──
$step11 = demo_step( '۱۱. تست یادآوری PM', function () use ( $demo, $device_id ) {
    global $wpdb;
    $table = $wpdb->prefix . 'svc_pm_contracts';
    $wpdb->insert( $table, [
        'report_id'       => null,
        'device_id'       => $device_id ?: null,
        'customer_name'   => $demo['customer']['name'],
        'phone'           => $demo['customer']['phone'],
        'site_label'      => $demo['customer']['site'] . ' (PM تست)',
        'plan'            => 'monthly',
        'status'          => 'active',
        'next_visit_date' => current_time( 'Y-m-d' ),
        'created_at'      => current_time( 'mysql' ),
    ] );
    $pm_id = (int) $wpdb->insert_id;
    $result = SR_Controller::cron_pm_reminders();
    return [ 'pm_contract_id' => $pm_id, 'reminder_result' => $result ];
} );
$log[] = $step11;

render:
$summary = [
    'tracking_code'   => $tracking_code ?? '',
    'request_no'      => $request_no ?? '',
    'request_id'      => $request_id ?? 0,
    'report_no'       => $report_no ?? '',
    'report_id'       => $report_id ?? 0,
    'public_token'    => $public_token ?? '',
    'conversation_id' => $conversation_id ?? 0,
    'device_id'       => $device_id ?? 0,
    'session_key'     => $session_key,
    'technician'      => $tech_name ?? '',
    'links'           => [
        'widget_track'  => "ویجت → تب پیگیری → کد: " . ( $tracking_code ?? '—' ),
        'report_public' => $base . '/service-report.php?token=' . ( $public_token ?? '' ),
        'pay_page'      => $base . '/service-pay.php?token=' . ( $public_token ?? '' ),
        'erp_service'   => $base . '/index.php#service',
        'docs'          => $base . '/docs/service/',
    ],
];

file_put_contents(
    __DIR__ . '/docs/service/demo-result.json',
    json_encode( [ 'summary' => $summary, 'steps' => $log, 'demo_input' => $demo ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT )
);

header( 'Content-Type: text/html; charset=utf-8' );
?>
<!DOCTYPE html>
<html dir="rtl" lang="fa">
<head>
    <meta charset="utf-8">
    <title>Demo خدمات میدانی — نتیجه</title>
    <style>
        body { font-family: Tahoma, sans-serif; background: #f8fafc; padding: 24px; max-width: 900px; margin: 0 auto; }
        h1 { color: #1e40af; }
        .card { background: #fff; border: 1px solid #e2e8f0; border-radius: 12px; padding: 16px; margin: 12px 0; }
        .ok { border-right: 4px solid #22c55e; }
        .err { border-right: 4px solid #ef4444; background: #fef2f2; }
        code, pre { background: #f1f5f9; padding: 2px 6px; border-radius: 4px; font-size: 12px; }
        pre { padding: 12px; overflow: auto; direction: ltr; text-align: left; }
        a { color: #1d4ed8; }
        table { width: 100%; border-collapse: collapse; font-size: 13px; }
        td, th { border: 1px solid #e2e8f0; padding: 8px; text-align: right; }
        th { background: #eff6ff; }
        .badge { display: inline-block; background: #1d4ed8; color: #fff; padding: 4px 12px; border-radius: 20px; font-weight: 700; letter-spacing: 2px; }
    </style>
</head>
<body>
<h1>✅ Demo کامل خدمات میدانی</h1>
<p>سناریوی تستی «رستوران سفره ایرانی — تعمیر سردخانه Carrier»</p>

<div class="card ok">
    <h2>🔑 اطلاعات کلیدی برای تست دستی</h2>
    <table>
        <tr><th>کد پیگیری مشتری</th><td><span class="badge"><?= htmlspecialchars( $summary['tracking_code'] ?: '—' ) ?></span></td></tr>
        <tr><th>شماره درخواست</th><td><code><?= htmlspecialchars( $summary['request_no'] ?: '—' ) ?></code></td></tr>
        <tr><th>شماره گزارش SRD</th><td><code><?= htmlspecialchars( $summary['report_no'] ?: '—' ) ?></code></td></tr>
        <tr><th>کارشناس تخصیص‌یافته</th><td><?= htmlspecialchars( $summary['technician'] ?: '—' ) ?></td></tr>
        <tr><th>مانده بدهی</th><td><b>۶,۷۲۰,۰۰۰ تومان</b></td></tr>
    </table>
</div>

<div class="card ok">
    <h2>🔗 لینک‌های تست</h2>
    <ul>
        <li><a href="<?= htmlspecialchars( $summary['links']['report_public'] ) ?>" target="_blank">گزارش عمومی + QR</a></li>
        <li><a href="<?= htmlspecialchars( $summary['links']['pay_page'] ) ?>" target="_blank">صفحه پرداخت آنلاین</a></li>
        <li><a href="<?= htmlspecialchars( $summary['links']['erp_service'] ) ?>" target="_blank">ERP → خدمات میدانی</a></li>
        <li><a href="<?= htmlspecialchars( $summary['links']['docs'] ) ?>" target="_blank">اسناد آموزشی</a></li>
    </ul>
    <p><b>ویجت:</b> <?= htmlspecialchars( $summary['links']['widget_track'] ) ?></p>
</div>

<h2>مراحل اجرا شده</h2>
<?php foreach ( $log as $s ): ?>
<div class="card <?= $s['ok'] ? 'ok' : 'err' ?>">
    <h3><?= $s['ok'] ? '✅' : '❌' ?> <?= htmlspecialchars( $s['title'] ) ?></h3>
    <?php if ( ! $s['ok'] ): ?>
        <p style="color:#991b1b;"><?= htmlspecialchars( $s['error'] ?? '' ) ?></p>
    <?php else: ?>
        <pre><?= htmlspecialchars( json_encode( $s['data'], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT ) ) ?></pre>
    <?php endif; ?>
</div>
<?php endforeach; ?>

<p style="font-size:11px;color:#94a3b8;">JSON: docs/service/demo-result.json</p>
</body>
</html>
