<?php
header('Content-Type: application/json');

require_once('../libs/classes/DbPathsArray.php');
require_once('../libs/classes/App_DB.php');
require_once('../libs/classes/Mailer.php');
require_once('../libs/classes/EmailTemplate.php');
require_once('../libs/classes/EnvLoader.php');
require_once('../libs/classes/MyMethods.php');

session_start();

$db = new App_DB(DBU::$dba_user);
$method = new MyMethods();

$response = [
    'success' => false,
    'message' => ''
];

if (!isset($_SESSION['userid'])) {
    $response['message'] = 'آپ کا سیشن ختم ہو چکا ہے، براہ کرم دوبارہ لاگ ان کریں۔';
    echo json_encode($response);
    exit;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $data = json_decode(file_get_contents('php://input'), true);

    $oldPassword = trim($data['oldPassword'] ?? '');
    $newPassword = trim($data['newPassword'] ?? '');
    $confirmPassword = trim($data['confirmPassword'] ?? '');

    $userId = $_SESSION['userid'];

    /* -----------------------------
       Validate Input
    ----------------------------- */

    if (empty($oldPassword) || empty($newPassword) || empty($confirmPassword)) {
        $response['message'] = 'براہ کرم تمام فیلڈز پُر کریں۔';
        echo json_encode($response);
        exit;
    }

    if ($newPassword !== $confirmPassword) {
        $response['message'] = 'نیا پاس ورڈ اور اس کی تصدیق ایک جیسے نہیں ہیں۔';
        echo json_encode($response);
        exit;
    }

    /* Password Strength Check */
    if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d).{8,}$/', $newPassword)) {
        $response['message'] = 'پاس ورڈ کم از کم 8 حروف پر مشتمل ہو اور اس میں ایک عدد بھی ہونا چاہیے۔';
        echo json_encode($response);
        exit;
    }

    try {

        /* -----------------------------
           Fetch User Record
        ----------------------------- */

        $sqlSearch = "SELECT userkey, ownreName, email 
                      FROM login 
                      WHERE userid = :userid";

        $user = $db->getRecordFilled($sqlSearch, [
            'userid' => $userId
        ]);

        if (!$user || !is_array($user)) {
            $response['message'] = 'صارف کی معلومات حاصل نہیں ہو سکیں۔';
            echo json_encode($response);
            exit;
        }

        /* -----------------------------
           Verify Old Password
        ----------------------------- */

        if (!$method->verify_user($oldPassword, $user['userkey']) && $oldPassword !== $user['userkey']) {
            $response['message'] = 'آپ کا پرانا پاس ورڈ درست نہیں ہے۔';
            echo json_encode($response);
            exit;
        }

        /* -----------------------------
           Hash New Password
        ----------------------------- */

        $hashedNewPassword = $method->make_hash($newPassword);

        if (!$hashedNewPassword) {
            $response['message'] = 'پاس ورڈ محفوظ کرنے میں خرابی پیش آئی۔';
            echo json_encode($response);
            exit;
        }

        /* -----------------------------
           Update Password
        ----------------------------- */

        $sqlUpdate = "UPDATE login 
                      SET userkey = :newKey 
                      WHERE userid = :userid";

        $updated = $db->dbQuery($sqlUpdate, [
            'newKey' => $hashedNewPassword,
            'userid' => $userId
        ]);

        if ($updated) {

            /* Regenerate Session */
            session_regenerate_id(true);

            $response['success'] = true;
            $response['message'] = 'آپ کا پاس ورڈ کامیابی کے ساتھ تبدیل ہو چکا ہے۔';

            /* -----------------------------
               Send Email Notification
            ----------------------------- */

            if (!empty($user['email'])) {

                $communicator = new Communicator();

                $emailBody = EmailTemplate::render('password_changed', [
                    'ownerName' => $user['ownreName'],
                    'appName' => EnvLoader::get('APP_NAME', 'Madrasa Management System'),
                    'userId' => $userId,
                    'newPassword' => $newPassword
                ]);

                $communicator->sendEmailRnd(
                    [$user['email']],
                    EnvLoader::get('MAIL_FROM_NAME', 'Madrasa System'),
                    'Password Changed Notification',
                    $emailBody
                );
            }

        } else {
            $response['message'] = 'پاس ورڈ تبدیل کرنے میں فنی خرابی پیش آئی۔';
        }

    } catch (Exception $e) {

        $response['message'] = 'ڈیٹابیس کی خرابی: ' . $e->getMessage();

    }
}

echo json_encode($response);