<?php
/**
 * Helpers comune paginilor de comenzi (orders.php, order.php, order-print.php)
 * și endpoint-urilor din api/.
 */
require_once __DIR__ . '/db.php';

/** Statusurile permise pentru o comandă + eticheta afișată (în limba dorită). */
function order_statuses(string $lang = 'ro'): array
{
    $map = [
        'ro' => [
            'draft'     => 'Ciornă',
            'sent'      => 'Trimisă',
            'confirmed' => 'Confirmată',
            'received'  => 'Primită',
            'cancelled' => 'Anulată',
        ],
        'en' => [
            'draft'     => 'Draft',
            'sent'      => 'Sent',
            'confirmed' => 'Confirmed',
            'received'  => 'Received',
            'cancelled' => 'Cancelled',
        ],
    ];
    return $map[$lang] ?? $map['ro'];
}

/** Limbile în care se poate emite documentul. */
function order_langs(): array
{
    return ['ro' => 'Română', 'en' => 'English'];
}

/**
 * Etichetele documentului (comandă printată + export XLS), pe limbi.
 * Folosite și în JS (order.php le trimite ca JSON în componentă).
 */
function order_labels(string $lang = 'ro'): array
{
    $dict = [
        'ro' => [
            'doc_title'      => 'COMANDĂ MARFĂ',
            'supplier'       => 'Furnizor',
            'order_date'     => 'Data comenzii',
            'delivery'       => 'Livrare estimată',
            'currency'       => 'Monedă',
            'idx'            => '#',
            'code'           => 'Cod',
            'name'           => 'Denumire',
            'unit'           => 'UM',
            'qty'            => 'Cantitate',
            'qty_short'      => 'Cant.',
            'unit_price'     => 'Preț unitar',
            'amount'         => 'Valoare',
            'items'          => 'Articole',
            'lines'          => 'linii',
            'pcs'            => 'buc',
            'subtotal'       => 'Subtotal',
            'vat'            => 'TVA',
            'total'          => 'TOTAL',
            'notes'          => 'Observații',
            'empty'          => 'Comandă fără articole.',
            'sign_buyer'     => 'Întocmit / Beneficiar',
            'sign_supplier'  => 'Confirmat furnizor',
            'generated'      => 'Document generat automat la',
            'company_hint'   => 'completează datele firmei în pagina Orders → Firma mea',
            'company_ph'     => 'Firma ta',
            'vat_id'         => 'CUI',
            'reg'            => 'Reg. com.',
            'phone'          => 'Telefon',
            'email'          => 'Email',
            'bank'           => 'Bancă',
            'iban'           => 'IBAN',
            'web'            => 'Web',
        ],
        'en' => [
            'doc_title'      => 'PURCHASE ORDER',
            'supplier'       => 'Supplier',
            'order_date'     => 'Order date',
            'delivery'       => 'Estimated delivery',
            'currency'       => 'Currency',
            'idx'            => '#',
            'code'           => 'Code',
            'name'           => 'Description',
            'unit'           => 'UoM',
            'qty'            => 'Quantity',
            'qty_short'      => 'Qty',
            'unit_price'     => 'Unit price',
            'amount'         => 'Amount',
            'items'          => 'Items',
            'lines'          => 'lines',
            'pcs'            => 'pcs',
            'subtotal'       => 'Subtotal',
            'vat'            => 'VAT',
            'total'          => 'TOTAL',
            'notes'          => 'Notes',
            'empty'          => 'Order has no items.',
            'sign_buyer'     => 'Prepared by / Buyer',
            'sign_supplier'  => 'Supplier confirmation',
            'generated'      => 'Document generated automatically on',
            'company_hint'   => 'fill in your company details on the Orders page → My company',
            'company_ph'     => 'Your company',
            'vat_id'         => 'VAT no.',
            'reg'            => 'Trade reg.',
            'phone'          => 'Phone',
            'email'          => 'Email',
            'bank'           => 'Bank',
            'iban'           => 'IBAN',
            'web'            => 'Web',
        ],
    ];
    return $dict[$lang] ?? $dict['ro'];
}

/** Normalizează un cod de limbă la una dintre limbile suportate. */
function order_lang(?string $lang): string
{
    $lang = strtolower(trim((string)$lang));
    return array_key_exists($lang, order_langs()) ? $lang : 'ro';
}

/** Unitățile de măsură propuse în selectoare. */
function order_units(): array
{
    return ['buc', 'set', 'cutie', 'bax', 'kg', 'm', 'ml', 'rolă', 'oră'];
}

/**
 * Următorul număr de comandă: CMD-2026-0001 (contor pe an calendaristic).
 */
function order_next_no(): string
{
    $year = date('Y');
    $last = db_scalar(
        "SELECT order_no FROM orders WHERE order_no LIKE ? ORDER BY order_no DESC LIMIT 1",
        ["CMD-$year-%"]
    );
    $seq = 1;
    if ($last && preg_match('/(\d+)$/', (string)$last, $m)) {
        $seq = (int)$m[1] + 1;
    }
    return sprintf('CMD-%s-%04d', $year, $seq);
}

/**
 * Totalurile unei comenzi din liniile ei.
 * @return array{subtotal:float, vat:float, total:float, qty:float, lines:int}
 */
function order_totals(array $items, float $vatRate = 0.0): array
{
    $subtotal = 0.0;
    $qty      = 0.0;
    foreach ($items as $it) {
        $subtotal += (float)$it['qty'] * (float)$it['unit_price'];
        $qty      += (float)$it['qty'];
    }
    $subtotal = round($subtotal, 2);
    $vat      = round($subtotal * $vatRate / 100, 2);
    return [
        'subtotal' => $subtotal,
        'vat'      => $vat,
        'total'    => round($subtotal + $vat, 2),
        'qty'      => $qty,
        'lines'    => count($items),
    ];
}

/** Format monetar: 1.234,56 (ro) / 1,234.56 (en) */
function money(float $v, string $lang = 'ro', int $decimals = 2): string
{
    return $lang === 'en'
        ? number_format($v, $decimals, '.', ',')
        : number_format($v, $decimals, ',', '.');
}

/** Câte zecimale se folosesc la prețul unitar (0–6, implicit 2). */
function order_price_decimals($value): int
{
    if ($value === null || $value === '') return 2;   // comenzi vechi, fără valoare setată
    $d = (int)$value;
    if ($d < 0) $d = 0;
    if ($d > 6) $d = 6;
    return $d;
}

/** Cantitate fără zecimale inutile: 2 / 2,5 (ro) · 2 / 2.5 (en) */
function qty_fmt(float $v, string $lang = 'ro'): string
{
    if ($lang === 'en') {
        return rtrim(rtrim(number_format($v, 3, '.', ','), '0'), '.');
    }
    return rtrim(rtrim(number_format($v, 3, ',', '.'), '0'), ',');
}

/** Traduce unitatea de măsură pe documentul în engleză (necunoscutele rămân ca atare). */
function order_unit_label(string $unit, string $lang = 'ro'): string
{
    if ($lang !== 'en') return $unit;
    $map = [
        'buc'   => 'pcs',
        'set'   => 'set',
        'cutie' => 'box',
        'bax'   => 'case',
        'kg'    => 'kg',
        'm'     => 'm',
        'ml'    => 'ml',
        'rolă'  => 'roll',
        'oră'   => 'hour',
    ];
    return $map[$unit] ?? $unit;
}

/** Cheile din app_settings în care se salvează datele firmei proprii. */
function order_company_keys(): array
{
    return ['name', 'cui', 'reg', 'address', 'city', 'country', 'phone', 'email', 'bank', 'iban', 'web'];
}

/** Datele firmei folosite în antetul comenzii printate (din app_settings). */
function order_company(): array
{
    $out = [];
    foreach (order_company_keys() as $k) {
        $out[$k] = setting_get('order_company_' . $k, '') ?? '';
    }
    return $out;
}

/**
 * Bara de taburi comună secțiunii Orders (Comenzi / Marfă / Firma mea).
 * $current = 'orders' | 'marfa' | 'firma'
 */
function order_tabs(string $current): string
{
    $tabs = [
        'orders' => ['label' => 'Comenzi',    'url' => url('orders.php')],
        'marfa'  => ['label' => 'Marfă',      'url' => url('marfa.php')],
        'firma'  => ['label' => 'Firma mea',  'url' => url('firma.php')],
    ];
    $html = '<div class="flex items-center gap-1 mb-4 border-b border-slate-200">';
    foreach ($tabs as $key => $t) {
        $active = $key === $current;
        $cls = $active
            ? 'border-brand-600 text-brand-700'
            : 'border-transparent text-slate-500 hover:text-slate-800 hover:border-slate-300';
        $html .= '<a href="' . e($t['url']) . '" class="px-3 py-2 -mb-px border-b-2 text-sm font-medium transition ' . $cls . '">'
               . e($t['label']) . '</a>';
    }
    return $html . '</div>';
}

/** Comanda + liniile ei, sau null dacă nu există. */
function order_load(int $id): ?array
{
    $rows = db_select("SELECT * FROM orders WHERE id = ?", [$id]);
    if (!$rows) return null;
    $order = $rows[0];
    $order['items'] = db_select(
        "SELECT * FROM order_items WHERE order_id = ? ORDER BY position ASC, id ASC",
        [$id]
    );
    return $order;
}
