<?php
/**
 * Public_Auth_Controller.php
 * Endpointهای عمومی احراز هویت (بدون JWT)
 * - POST /acc/v1/public/auth/register
 * - POST /acc/v1/public/auth/forgot-password
 * - POST /acc/v1/public/auth/login  (نسخه عمومی با nonce)
 */

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

class Public_Auth_Controller {

    public static function register_routes(): void {
        $ns = 'acc/v1';

        register_rest_route( $ns, '/public/auth/login', [
            'methods'             => 'POST',
            'callback'            => [ self::class, 'login' ],
            'permission_callback' => '__return_true',
        ] );

        register_rest_route( $ns, '/public/auth/register', [
            'methods'             => 'POST',
            'callback'            => [ self::class, 'register_user' ],
            'permission_callback' => '__return_true',
        ] );

        register_rest_route( $ns, '/public/auth/forgot-password', [
            'methods'             => 'POST',
            'callback'            => [ self::class, 'forgot_password' ],
            'permission_callback' => '__return_true',
        ] );
    }

    /* ── Login عمومی ─────────────────────────────────── */
    public static function login( \WP_REST_Request $req ): \WP_REST_Response|\WP_Error {

        $username = sanitize_text_field( $req->get_param('username') ?? '' );
        $password = (string) ( $req->get_param('password') ?? '' );

        if ( ! $username || ! $password ) {
            return new \WP_Error( 'missing_credentials', 'نام کاربری و رمز عبور الزامی است.', ['status' => 400] );
        }

        if ( function_exists( 'acc_rate_limit' ) ) {
            $ip = function_exists( 'acc_client_ip' ) ? acc_client_ip() : ( $_SERVER['REMOTE_ADDR'] ?? '0' );
            if ( ! acc_rate_limit( 'login_ip_' . $ip, 30, 900 ) ) {
                return new \WP_Error( 'rate_limited', 'تعداد تلاش ورود زیاد است. کمی بعد تلاش کنید.', [ 'status' => 429 ] );
            }
            $user_key = 'login_user_' . strtolower( $username );
            if ( ! acc_rate_limit( $user_key, 12, 900 ) ) {
                return new \WP_Error( 'rate_limited', 'تعداد تلاش برای این کاربر زیاد است.', [ 'status' => 429 ] );
            }
        }

        $user = wp_authenticate( $username, $password );

        if ( is_wp_error( $user ) ) {
            return new \WP_Error( 'invalid_credentials', 'نام کاربری یا رمز عبور اشتباه است.', ['status' => 401] );
        }

        if ( ! function_exists( 'acc_jwt_generate_token' ) ) {
            return new \WP_Error( 'jwt_unavailable', 'سامانه JWT در دسترس نیست.', ['status' => 500] );
        }

        $token = acc_jwt_generate_token( $user, false );

        return new \WP_REST_Response( [
            'success' => true,
            'token'   => $token,
            'user'    => [
                'id'       => $user->ID,
                'name'     => $user->display_name,
                'email'    => $user->user_email,
                'username' => $user->user_login,
            ],
        ], 200 );
    }

    /* ── Register ────────────────────────────────────── */
    public static function register_user( \WP_REST_Request $req ): \WP_REST_Response|\WP_Error {

        if ( ! get_option('users_can_register') ) {
            return new \WP_Error( 'disabled', 'ثبت‌نام کاربر جدید غیرفعال است.', ['status' => 403] );
        }

        if ( function_exists( 'acc_rate_limit' ) ) {
            $ip = function_exists( 'acc_client_ip' ) ? acc_client_ip() : ( $_SERVER['REMOTE_ADDR'] ?? '0' );
            if ( ! acc_rate_limit( 'register_ip_' . $ip, 8, 3600 ) ) {
                return new \WP_Error( 'rate_limited', 'تعداد ثبت‌نام از این IP زیاد است.', [ 'status' => 429 ] );
            }
        }

        $username  = sanitize_user( $req->get_param('username') ?? '' );
        $email     = sanitize_email( $req->get_param('email') ?? '' );
        $password  = (string) ( $req->get_param('password') ?? '' );
        $firstname = sanitize_text_field( $req->get_param('firstname') ?? '' );
        $lastname  = sanitize_text_field( $req->get_param('lastname') ?? '' );

        if ( ! $username || ! $email || ! $password ) {
            return new \WP_Error( 'missing_fields', 'نام کاربری، ایمیل و رمز عبور الزامی است.', ['status' => 400] );
        }

        if ( ! is_email( $email ) ) {
            return new \WP_Error( 'invalid_email', 'آدرس ایمیل معتبر نیست.', ['status' => 400] );
        }

        if ( username_exists( $username ) ) {
            return new \WP_Error( 'username_exists', 'این نام کاربری قبلاً استفاده شده است.', ['status' => 409] );
        }

        if ( email_exists( $email ) ) {
            return new \WP_Error( 'email_exists', 'این ایمیل قبلاً ثبت شده است.', ['status' => 409] );
        }

        if ( mb_strlen( $password ) < 8 ) {
            return new \WP_Error( 'weak_password', 'رمز عبور باید حداقل ۸ کاراکتر باشد.', ['status' => 400] );
        }

        $user_id = wp_create_user( $username, $password, $email );

        if ( is_wp_error( $user_id ) ) {
            return new \WP_Error( 'reg_failed', $user_id->get_error_message(), ['status' => 500] );
        }

        if ( $firstname || $lastname ) {
            wp_update_user( [
                'ID'           => $user_id,
                'first_name'   => $firstname,
                'last_name'    => $lastname,
                'display_name' => trim("$firstname $lastname") ?: $username,
            ] );
        }

        wp_new_user_notification( $user_id, null, 'both' );

        return new \WP_REST_Response( [
            'success' => true,
            'message' => 'حساب کاربری با موفقیت ایجاد شد. می‌توانید وارد شوید.',
        ], 201 );
    }

    /* ── Forgot Password ─────────────────────────────── */
    public static function forgot_password( \WP_REST_Request $req ): \WP_REST_Response|\WP_Error {

        $login = sanitize_text_field( $req->get_param('login') ?? '' );

        if ( ! $login ) {
            return new \WP_Error( 'missing_login', 'ایمیل یا نام کاربری الزامی است.', ['status' => 400] );
        }

        if ( function_exists( 'acc_rate_limit' ) ) {
            $ip = function_exists( 'acc_client_ip' ) ? acc_client_ip() : ( $_SERVER['REMOTE_ADDR'] ?? '0' );
            if ( ! acc_rate_limit( 'forgot_ip_' . $ip, 8, 3600 ) ) {
                return new \WP_Error( 'rate_limited', 'تعداد درخواست بازیابی زیاد است.', [ 'status' => 429 ] );
            }
        }

        // پیام یکسان برای وجود/عدم وجود (امنیت)
        $ok_response = new \WP_REST_Response( [
            'success' => true,
            'message' => 'اگر این حساب کاربری وجود داشته باشد، لینک بازیابی رمز به ایمیل ارسال خواهد شد.',
        ], 200 );

        $user = is_email( $login )
            ? get_user_by( 'email', $login )
            : get_user_by( 'login', $login );

        if ( ! $user ) return $ok_response;

        $result = retrieve_password( $user->user_login );

        if ( is_wp_error( $result ) ) {
            return new \WP_Error( 'reset_failed', 'ارسال ایمیل بازیابی با خطا مواجه شد.', ['status' => 500] );
        }

        return $ok_response;
    }
}
