<?php

namespace App\Helpers;

/**
 * Status Manager untuk Pemesanan Custom
 * 
 * Mengatur alur status pesanan dengan validasi state machine
 */
class StatusManager
{
    // Status constants
    const STATUS_MENUNGGU_KONFIRMASI = 'menunggu_konfirmasi_admin';
    const STATUS_MENUNGGU_PEMBAYARAN = 'menunggu_pembayaran';
    const STATUS_MENUNGGU_INPUT_METER = 'menunggu_input_meter';
    const STATUS_SEDANG_DIPROSES = 'sedang_diproses';
    const STATUS_SELESAI_SIAP_KIRIM = 'selesai_siap_kirim';
    const STATUS_SELESAI_DIAMBIL = 'selesai_diambil';
    const STATUS_DIBATALKAN = 'dibatalkan';

    /**
     * Valid status transitions
     * Format: [current_status => [allowed_next_statuses]]
     */
    private static $validTransitions = [
        self::STATUS_MENUNGGU_KONFIRMASI => [
            self::STATUS_MENUNGGU_PEMBAYARAN,
            self::STATUS_DIBATALKAN
        ],
        self::STATUS_MENUNGGU_PEMBAYARAN => [
            self::STATUS_MENUNGGU_INPUT_METER,
            self::STATUS_DIBATALKAN
        ],
        self::STATUS_MENUNGGU_INPUT_METER => [
            self::STATUS_SEDANG_DIPROSES
        ],
        self::STATUS_SEDANG_DIPROSES => [
            self::STATUS_SELESAI_SIAP_KIRIM
        ],
        self::STATUS_SELESAI_SIAP_KIRIM => [
            self::STATUS_SELESAI_DIAMBIL
        ],
        self::STATUS_SELESAI_DIAMBIL => [], // Final status
        self::STATUS_DIBATALKAN => [] // Final status
    ];

    /**
     * Status labels untuk display
     */
    private static $statusLabels = [
        self::STATUS_MENUNGGU_KONFIRMASI => 'Menunggu Konfirmasi Admin',
        self::STATUS_MENUNGGU_PEMBAYARAN => 'Menunggu Pembayaran',
        self::STATUS_MENUNGGU_INPUT_METER => 'Menunggu Input Meter/Ukuran',
        self::STATUS_SEDANG_DIPROSES => 'Sedang Diproses',
        self::STATUS_SELESAI_SIAP_KIRIM => 'Selesai - Siap Pengiriman',
        self::STATUS_SELESAI_DIAMBIL => 'Selesai - Sudah Diambil',
        self::STATUS_DIBATALKAN => 'Dibatalkan'
    ];

    /**
     * Status badge colors (Bootstrap classes)
     */
    private static $statusBadges = [
        self::STATUS_MENUNGGU_KONFIRMASI => 'warning',
        self::STATUS_MENUNGGU_PEMBAYARAN => 'info',
        self::STATUS_MENUNGGU_INPUT_METER => 'primary',
        self::STATUS_SEDANG_DIPROSES => 'secondary',
        self::STATUS_SELESAI_SIAP_KIRIM => 'success',
        self::STATUS_SELESAI_DIAMBIL => 'dark',
        self::STATUS_DIBATALKAN => 'danger'
    ];

    /**
     * Check if status transition is valid
     * 
     * @param string $currentStatus
     * @param string $newStatus
     * @return bool
     */
    public static function canTransition(string $currentStatus, string $newStatus): bool
    {
        if (!isset(self::$validTransitions[$currentStatus])) {
            return false;
        }

        return in_array($newStatus, self::$validTransitions[$currentStatus]);
    }

    /**
     * Get allowed next statuses
     * 
     * @param string $currentStatus
     * @return array
     */
    public static function getAllowedNextStatuses(string $currentStatus): array
    {
        return self::$validTransitions[$currentStatus] ?? [];
    }

    /**
     * Get status label
     * 
     * @param string $status
     * @return string
     */
    public static function getLabel(string $status): string
    {
        return self::$statusLabels[$status] ?? $status;
    }

    /**
     * Get badge class for status
     * 
     * @param string $status
     * @return string
     */
    public static function getBadgeClass(string $status): string
    {
        $color = self::$statusBadges[$status] ?? 'secondary';
        return "badge badge-{$color}";
    }

    /**
     * Get all statuses
     * 
     * @return array
     */
    public static function getAllStatuses(): array
    {
        return [
            self::STATUS_MENUNGGU_KONFIRMASI,
            self::STATUS_MENUNGGU_PEMBAYARAN,
            self::STATUS_MENUNGGU_INPUT_METER,
            self::STATUS_SEDANG_DIPROSES,
            self::STATUS_SELESAI_SIAP_KIRIM,
            self::STATUS_SELESAI_DIAMBIL,
            self::STATUS_DIBATALKAN
        ];
    }

    /**
     * Validate and get next status based on action
     * 
     * @param string $currentStatus
     * @param string $action (admin_confirm, customer_pay, admin_input_meter, etc)
     * @return string|null
     */
    public static function getNextStatusByAction(string $currentStatus, string $action): ?string
    {
        $actionMap = [
            'admin_confirm' => [
                self::STATUS_MENUNGGU_KONFIRMASI => self::STATUS_MENUNGGU_PEMBAYARAN
            ],
            'customer_pay' => [
                self::STATUS_MENUNGGU_PEMBAYARAN => self::STATUS_MENUNGGU_INPUT_METER
            ],
            'admin_input_meter' => [
                self::STATUS_MENUNGGU_INPUT_METER => self::STATUS_SEDANG_DIPROSES
            ],
            'production_complete' => [
                self::STATUS_SEDANG_DIPROSES => self::STATUS_SELESAI_SIAP_KIRIM
            ],
            'order_picked' => [
                self::STATUS_SELESAI_SIAP_KIRIM => self::STATUS_SELESAI_DIAMBIL
            ],
            'cancel' => [
                self::STATUS_MENUNGGU_KONFIRMASI => self::STATUS_DIBATALKAN,
                self::STATUS_MENUNGGU_PEMBAYARAN => self::STATUS_DIBATALKAN
            ]
        ];

        if (!isset($actionMap[$action][$currentStatus])) {
            return null;
        }

        $nextStatus = $actionMap[$action][$currentStatus];

        // Validate transition
        if (!self::canTransition($currentStatus, $nextStatus)) {
            return null;
        }

        return $nextStatus;
    }

    /**
     * Check if customer can edit order
     * 
     * @param string $status
     * @return bool
     */
    public static function canCustomerEdit(string $status): bool
    {
        return in_array($status, [
            self::STATUS_MENUNGGU_KONFIRMASI
        ]);
    }

    /**
     * Check if payment button should be shown
     * 
     * @param string $status
     * @return bool
     */
    public static function canShowPaymentButton(string $status): bool
    {
        return $status === self::STATUS_MENUNGGU_PEMBAYARAN;
    }

    /**
     * Check if alamat can be edited
     * 
     * @param string $status
     * @param bool $isLocked
     * @return bool
     */
    public static function canEditAlamat(string $status, bool $isLocked): bool
    {
        // Alamat bisa diedit jika:
        // 1. Belum terkunci
        // 2. Status masih menunggu konfirmasi atau menunggu pembayaran
        return !$isLocked && in_array($status, [
            self::STATUS_MENUNGGU_KONFIRMASI,
            self::STATUS_MENUNGGU_PEMBAYARAN
        ]);
    }

    /**
     * Get status description untuk customer
     * 
     * @param string $status
     * @return string
     */
    public static function getCustomerDescription(string $status): string
    {
        $descriptions = [
            self::STATUS_MENUNGGU_KONFIRMASI => 'Pesanan Anda sedang ditinjau oleh admin. Mohon tunggu konfirmasi.',
            self::STATUS_MENUNGGU_PEMBAYARAN => 'Pesanan telah dikonfirmasi. Silakan lakukan pembayaran.',
            self::STATUS_MENUNGGU_INPUT_METER => 'Pembayaran diterima. Admin sedang menginput detail ukuran.',
            self::STATUS_SEDANG_DIPROSES => 'Pesanan Anda sedang dalam proses produksi.',
            self::STATUS_SELESAI_SIAP_KIRIM => 'Pesanan Anda sudah selesai dan siap untuk diambil/dikirim.',
            self::STATUS_SELESAI_DIAMBIL => 'Pesanan telah selesai dan sudah diambil. Terima kasih!',
            self::STATUS_DIBATALKAN => 'Pesanan telah dibatalkan.'
        ];

        return $descriptions[$status] ?? '';
    }

    /**
     * Get icon for status
     * 
     * @param string $status
     * @return string (FontAwesome class)
     */
    public static function getIcon(string $status): string
    {
        $icons = [
            self::STATUS_MENUNGGU_KONFIRMASI => 'fa-clock',
            self::STATUS_MENUNGGU_PEMBAYARAN => 'fa-money-bill-wave',
            self::STATUS_MENUNGGU_INPUT_METER => 'fa-ruler-combined',
            self::STATUS_SEDANG_DIPROSES => 'fa-cogs',
            self::STATUS_SELESAI_SIAP_KIRIM => 'fa-check-circle',
            self::STATUS_SELESAI_DIAMBIL => 'fa-handshake',
            self::STATUS_DIBATALKAN => 'fa-times-circle'
        ];

        return $icons[$status] ?? 'fa-question-circle';
    }

    public function pre($array)
    {
        echo '<pre>';
        print_r($array);
        echo '</pre>';
    }
}
