<?php

namespace Core\App\Controllers;

use Core\App\Models\AdminModel;
use Core\App\Models\AdminPasswordReset;
use Core\System\Request;
use Core\System\Response;
use Core\System\Mailer;
use Core\System\AdminAuthTheme;
use Core\System\Language;

class AdminPasswordController
{
    /**
     * عرض صفحة طلب استعادة كلمة المرور
     */
    public function showForgotForm(): void
    {
        require ROOT_PATH . '/admin/templates/forgot_password.php';
        exit;
    }

    /**
     * معالجة طلب "نسيت كلمة المرور"
     */
    public function sendResetLink(): void
    {
        $email = trim((string) Request::input('email'));

        // سلوك محايد دائمًا (Anti user-enumeration)
        if ($email === '') {
            Response::redirect('/admin/login?reset=1');
            exit;
        }

        // تنظيف التوكنات المنتهية (مسموح هنا فقط)
        $resetModel = new AdminPasswordReset();
        $resetModel->cleanupExpired();

        $adminModel = new AdminModel();
        $admin = $adminModel->findByEmail($email);

        if ($admin) {
            // === ضبط لغة الإيميل من لغة لوحة التحكم ===
            $theme = AdminAuthTheme::get();
            if (!empty($theme['lang'])) {
                Language::set($theme['lang']);
            }

            // إنشاء Token
            $token     = bin2hex(random_bytes(32));
            $tokenHash = hash('sha256', $token);
            $expiresAt = (new \DateTime('+30 minutes'))->format('Y-m-d H:i:s');

            $resetModel->createReset(
                $email,
                $tokenHash,
                $expiresAt,
                $_SERVER['REMOTE_ADDR'] ?? null,
                $_SERVER['HTTP_USER_AGENT'] ?? null
            );

            // رابط إعادة التعيين
            $resetLink = $this->buildAbsoluteUrl(
                '/admin/reset-password?token=' . urlencode($token)
            );

            // ===== Email احترافي =====
            $subject = __('admin.mail.reset.subject', 'Reset your password');

            $body = '
            <div style="background:#f4f6f9;padding:40px 0;font-family:Arial,sans-serif;">
              <div style="max-width:600px;margin:0 auto;background:#ffffff;border-radius:6px;overflow:hidden;">
                
                <div style="background:#2c3e50;padding:20px;text-align:center;color:#ffffff;">
                  <h1 style="margin:0;font-size:22px;">MTEngine</h1>
                </div>

                <div style="padding:30px;color:#333333;">
                  <h2 style="margin-top:0;">' . __('admin.mail.reset.title', 'Reset Password') . '</h2>

                  <p>' . __('admin.mail.reset.intro', 'We received a request to reset your admin password.') . '</p>

                  <p style="text-align:center;margin:30px 0;">
                    <a href="' . htmlspecialchars($resetLink, ENT_QUOTES, 'UTF-8') . '"
                       style="background:#007bff;color:#ffffff;padding:12px 22px;
                              text-decoration:none;border-radius:4px;display:inline-block;">
                       ' . __('admin.mail.reset.button', 'Reset Password') . '
                    </a>
                  </p>

                  <p style="font-size:13px;color:#666;">
                    ' . __('admin.mail.reset.expiry', 'This link will expire in 30 minutes.') . '
                  </p>

                  <p style="font-size:13px;color:#666;">
                    ' . __('admin.mail.reset.ignore', 'If you did not request this, you can safely ignore this email.') . '
                  </p>
                </div>

                <div style="background:#f1f1f1;padding:15px;text-align:center;font-size:12px;color:#888;">
                  © ' . date('Y') . ' MTEngine
                </div>

              </div>
            </div>
            ';

            try {
                $mailer = new Mailer();
                $mailer->send($email, $subject, $body);
            } catch (\Throwable $e) {
                // لا نكسر التدفق
            }
        }

        Response::redirect('/admin/login?reset=1');
        exit;
    }

    /**
     * عرض صفحة تعيين كلمة مرور جديدة
     */
    public function showResetForm(): void
    {
        require ROOT_PATH . '/admin/templates/reset_password.php';
        exit;
    }

    /**
     * معالجة إعادة تعيين كلمة المرور
     */
    public function resetPassword(): void
    {
        // ✅ قراءة التوكن بشكل صريح (حل نهائي للمشكلة)
        $token    = trim((string) ($_POST['token'] ?? $_GET['token'] ?? ''));
        $password = (string) Request::input('password');

        if ($token === '' || $password === '') {
            Response::redirect('/admin/reset-password?error=invalid');
            exit;
        }

        if (mb_strlen($password) < 8) {
            Response::redirect('/admin/reset-password?error=weak&token=' . urlencode($token));
            exit;
        }

        $tokenHash = hash('sha256', $token);

        $resetModel = new AdminPasswordReset();

        // ❌ لا cleanupExpired هنا
        $reset = $resetModel->findValidByToken($tokenHash);

        if (!$reset) {
            Response::redirect('/admin/reset-password?error=invalid');
            exit;
        }

        $adminModel = new AdminModel();
        $admin = $adminModel->findByEmail((string) $reset['email']);

        if (!$admin) {
            $resetModel->deleteById((int) $reset['id']);
            Response::redirect('/admin/reset-password?error=invalid');
            exit;
        }

        $adminModel->updatePassword((int) $admin['id'], $password);
        $resetModel->deleteById((int) $reset['id']);

        Response::redirect('/admin/login?reset=success');
        exit;
    }

    /**
     * بناء رابط مطلق
     * يُستخدم APP_URL من .env كمصدر أول لمنع Host Header Injection
     */
    protected function buildAbsoluteUrl(string $path): string
    {
        // Prefer APP_URL from .env — prevents Host Header Injection on password reset links
        $appUrl = \Core\System\Env::get('APP_URL', '');
        if ($appUrl !== '') {
            return rtrim($appUrl, '/') . $path;
        }

        // Fallback: SERVER_NAME is less spoofable than HTTP_HOST
        $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
        $host   = $_SERVER['SERVER_NAME'] ?? 'localhost';
        return $scheme . '://' . $host . $path;
    }
}
