<?php

class Messages {
    // Message types
    const TYPE_SUCCESS = 'success';
    const TYPE_ERROR = 'danger';
    const TYPE_INFO = 'info';
    const TYPE_WARNING = 'warning';

    // Default message configurations
    const NOTICE = [
        'DEFAULT' => [
            'type' => self::TYPE_INFO,
            'dismissible' => true
        ]
    ];

    const ERROR = [
        'DEFAULT' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ]
    ];

    const LOGIN = [
        'LOGIN_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'LOGIN_FAILED' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ],
        'LOGOUT_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'IP_BLACKLISTED' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ],
        'IP_NOT_WHITELISTED' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ],
        'TOO_MANY_ATTEMPTS' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ]
    ];

    const SECURITY = [
        'WHITELIST_ADD_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'WHITELIST_ADD_ERROR' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => true
        ],
        'WHITELIST_REMOVE_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'WHITELIST_REMOVE_ERROR' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => true
        ],
        'BLACKLIST_ADD_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'BLACKLIST_ADD_ERROR' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => true
        ],
        'BLACKLIST_REMOVE_SUCCESS' => [
            'type' => self::TYPE_SUCCESS,
            'dismissible' => true
        ],
        'BLACKLIST_REMOVE_ERROR' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => true
        ],
        'RATE_LIMIT_INFO' => [
            'type' => self::TYPE_INFO,
            'dismissible' => false
        ],
        'PERMISSION_DENIED' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ],
        'IP_REQUIRED' => [
            'type' => self::TYPE_ERROR,
            'dismissible' => false
        ]
    ];

    private static $strings = null;

    /**
     * Get message strings
     */
    private static function getStrings() {
        if (self::$strings === null) {
            self::$strings = require __DIR__ . '/../includes/messages-strings.php';
        }
        return self::$strings;
    }

    /**
     * Get message configuration by key
     */
    public static function get($category, $key) {
        $config = constant("self::$category")[$key] ?? null;
        if (!$config) return null;

        $strings = self::getStrings();
        $message = $strings[$category][$key] ?? '';

        return array_merge($config, ['message' => $message]);
    }

    /**
     * Render message HTML
     */
    public static function render($category, $key, $customMessage = null, $dismissible = false, $small = false) {
        $config = self::get($category, $key);
        if (!$config) return '';

        $message = $customMessage ?? $config['message'];
        $isDismissible = $dismissible ?? $config['dismissible'];
        $dismissClass = $isDismissible ? ' alert-dismissible fade show' : '';
        $dismissButton = $isDismissible ? '<button type="button" class="btn-close' . ($small ? ' btn-close-sm' : '') . '" data-bs-dismiss="alert" aria-label="Close"></button>' : '';
        $smallClass = $small ? ' alert-sm' : '';

        return sprintf(
            '<div class="alert alert-%s%s%s" role="alert">%s%s</div>',
            $config['type'],
            $dismissClass,
            $smallClass,
            htmlspecialchars($message),
            $dismissButton
        );
    }

    /**
     * Store message in session for display after redirect
     */
    public static function flash($category, $key, $customMessage = null, $dismissible = false, $small = false) {
        if (!isset($_SESSION['flash_messages'])) {
            $_SESSION['flash_messages'] = [];
        }
        $_SESSION['flash_messages'][] = [
            'category' => $category,
            'key' => $key,
            'custom_message' => $customMessage,
            'dismissible' => $dismissible,
            'small' => $small
        ];
    }

    /**
     * Get and clear all flash messages
     */
    public static function getFlash() {
        $messages = $_SESSION['flash_messages'] ?? [];
        unset($_SESSION['flash_messages']);
        return $messages;
    }
}