<?php

namespace BWDK\Support;

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * Status constants for DigiExpress message display. Map to WP admin notice CSS classes.
 */
if ( ! defined( 'BWDK_DX_STATUS_WARNING' ) ) {
    define( 'BWDK_DX_STATUS_WARNING', 'warning' );
}
if ( ! defined( 'BWDK_DX_STATUS_ERROR' ) ) {
    define( 'BWDK_DX_STATUS_ERROR', 'error' );
}
if ( ! defined( 'BWDK_DX_STATUS_INFO' ) ) {
    define( 'BWDK_DX_STATUS_INFO', 'info' );
}
if ( ! defined( 'BWDK_DX_STATUS_SUCCESS' ) ) {
    define( 'BWDK_DX_STATUS_SUCCESS', 'success' );
}

/**
 * Build a display message array from DigiExpress webhook detail.
 * Returns ['title' => string, 'message' => string, 'status' => one of BWDK_DX_STATUS_*] or null for unknown event_id.
 *
 * @param array $detail Webhook detail: event_type.id, payload, optionally last_mile_failure_reason.
 * @return array|null { title, message, status } or null.
 */
function bwdk_dx_build_message( array $detail ): ?array {
    if ( ! class_exists( '\\DX_Status_Engine', true ) ) {
        return null;
    }

    $resolved = \DX_Status_Engine::resolve_message( $detail );
    if ( ! is_array( $resolved ) ) {
        return null;
    }

    $status_map = [
        \DX_Status_Engine::STATUS_WARNING => BWDK_DX_STATUS_WARNING,
        \DX_Status_Engine::STATUS_ERROR   => BWDK_DX_STATUS_ERROR,
        \DX_Status_Engine::STATUS_INFO    => BWDK_DX_STATUS_INFO,
        \DX_Status_Engine::STATUS_SUCCESS => BWDK_DX_STATUS_SUCCESS,
    ];

    $status = isset( $resolved['status'] ) && isset( $status_map[ $resolved['status'] ] ) ? $status_map[ $resolved['status'] ] : BWDK_DX_STATUS_INFO;

    return [
        'title'   => isset( $resolved['title'] ) ? (string) $resolved['title'] : null,
        'message' => isset( $resolved['message'] ) ? (string) $resolved['message'] : '',
        'status'  => $status,
    ];
}

/**
 * Map failure_reason (event 20) to title and message.
 *
 * @param string $reason Raw reason code (e.g. CustomerAbsent, NoCoverage).
 * @return array { title, message }
 */
function _bwdk_dx_map_failure_reason_20( string $reason ): array {
    $reason = trim( $reason );
    $key    = $reason !== '' ? $reason : 'default';

    $map = [
        'CustomerAbsent'  => [
            'title'   => __( 'تحویل ناموفق - عدم حضور مشتری', 'bwdk' ),
            'message' => __( 'مرسوله در اولین تلاش تحویل داده نشد؛ مشتری حاضر نبود. هماهنگی برای ارسال مجدد.', 'bwdk' ),
        ],
        'NoCoverage'       => [
            'title'   => __( 'هماهنگی برای ارسال مجدد', 'bwdk' ),
            'message' => __( 'به دلیل عدم پوشش، ارسال مجدد هماهنگ می‌شود.', 'bwdk' ),
        ],
        'WrongAddress'     => [
            'title'   => __( 'هماهنگی برای ارسال مجدد', 'bwdk' ),
            'message' => __( 'آدرس نادرست بود؛ ارسال مجدد با آدرس صحیح هماهنگ می‌شود.', 'bwdk' ),
        ],
        'CustomerRefused'  => [
            'title'   => __( 'هماهنگی برای ارسال مجدد', 'bwdk' ),
            'message' => __( 'مشتری از دریافت مرسوله خودداری کرد؛ هماهنگی برای ارسال مجدد.', 'bwdk' ),
        ],
        'NoCode'           => [
            'title'   => __( 'هماهنگی برای ارسال مجدد', 'bwdk' ),
            'message' => __( 'کد تحویل در دسترس نبود؛ ارسال مجدد هماهنگ می‌شود.', 'bwdk' ),
        ],
        'default'          => [
            'title'   => __( 'هماهنگی برای ارسال مجدد', 'bwdk' ),
            'message' => __( 'تحویل انجام نشد؛ هماهنگی برای ارسال مجدد (عدم حضور مشتری).', 'bwdk' ),
        ],
    ];

    $entry = $map[ $key ] ?? $map['default'];
    return [
        'title'   => $entry['title'],
        'message' => $entry['message'],
    ];
}

/**
 * Extract hour (0-23) from datetime string "YYYY-MM-DD HH:MM:SS". Returns null if invalid.
 *
 * @param string $datetime
 * @return int|null
 */
function _bwdk_dx_extract_hour( string $datetime ): ?int {
    $datetime = trim( $datetime );
    if ( $datetime === '' ) {
        return null;
    }
    $ts = strtotime( $datetime );
    if ( $ts === false ) {
        return null;
    }
    $h = (int) date( 'G', $ts );
    if ( $h < 0 || $h > 23 ) {
        return null;
    }
    return $h;
}
