<?php

namespace WeDevs\Dokan\REST;

use WP_REST_Request;
use WP_REST_Server;
use WP_Error;
use WP_REST_Response;

class WithdrawControllerV2 extends WithdrawController {

    /**
     * Endpoint namespace.
     *
     * @var string
     */
    protected $namespace = 'dokan/v2';

    /**
     * Register all routes releated with stores.
     *
     * @since 3.7.10
     *
     * @return void
     */
    public function register_routes() {
        parent::register_routes();
        // Get withdraw settings for vendor.
        register_rest_route(
            $this->namespace, '/' . $this->rest_base . '/settings', [
                [
                    'methods'             => WP_REST_Server::READABLE,
                    'callback'            => [ $this, 'get_withdraw_settings' ],
                    'permission_callback' => [ $this, 'get_items_permissions_check' ],
                ],
            ]
        );

        // Returns withdraw summary.
        register_rest_route(
            $this->namespace, '/' . $this->rest_base . '/summary', [
                [
                    'methods'             => WP_REST_Server::READABLE,
                    'callback'            => [ $this, 'get_withdraw_summary' ],
                    'permission_callback' => [ $this, 'get_items_permissions_check' ],
                ],
            ]
        );

        register_rest_route(
            $this->namespace, '/' . $this->rest_base . '/make-default-method', [
                'methods'  => WP_REST_Server::CREATABLE,
                'callback' => [ $this, 'handle_make_default_method' ],
                'permission_callback' => [ $this, 'get_items_permissions_check' ],
                'args'     => [
                    'method' => [
                        'description' => __( 'Withdraw method key', 'dokan-lite' ),
                        'type'        => 'string',
                        'required'    => true,
                    ],
                ],
            ]
        );
    }

    /**
     * Returns withdraw settings for vendors.
     *
     * @since 3.7.10
     *
     * @return WP_REST_Response|WP_Error
     */
    public function get_withdraw_settings() {
        $active_methods          = dokan_withdraw_get_withdrawable_active_methods();
        $payment_methods         = array_intersect( dokan_get_seller_active_withdraw_methods(), dokan_withdraw_get_active_methods() );
        $default_withdraw_method = dokan_withdraw_get_default_method( dokan_get_current_user_id() );
        $setup_url               = dokan_get_navigation_url( 'settings/payment' );

        $payment_methods = array_map(
            function ( $payment_method ) {
                return [
                    'label' => dokan_withdraw_get_method_title( $payment_method ),
                    'value' => $payment_method,
                ];
            }, $payment_methods
        );

        $active_methods = array_map(
            function ( $active_method ) {
                return [
                    'label' => dokan_withdraw_get_method_title( $active_method ),
                    'value' => $active_method,
                    'icon'  => dokan_withdraw_get_method_icon( $active_method ),
                    'info'  => dokan_withdraw_get_method_additional_info( $active_method ),
                    'has_information'  => in_array( $active_method, dokan_get_seller_active_withdraw_methods(), true ),
                ];
            }, $active_methods
        );

        return rest_ensure_response(
            [
                'withdraw_method' => $default_withdraw_method,
                'is_manual_withdraw_enable' => ! empty( dokan_get_option( 'disbursement', 'dokan_withdraw' )['manual'] ?? false ),
                'payment_methods' => array_values( $payment_methods ),
                'active_methods'  => $active_methods,
                'setup_url'       => $setup_url,
            ]
        );
    }

    /**
     * Returns withdraw summary.
     *
     * @since 3.7.10
     *
     * @return WP_REST_Response|WP_Error
     */
    public function get_withdraw_summary() {
        $summary = dokan()->withdraw->get_user_withdraw_summary();
        return rest_ensure_response( $summary );
    }

    /**`
     * Make a withdraw method default for a vendor.
     *
     * @since 4.0.0
     *
     * @param WP_REST_Request $request
     *
     * @return WP_REST_Response|WP_Error
     */
    public function handle_make_default_method( WP_REST_Request $request ) {
        $method = $request->get_param( 'method' );

        if ( empty( $method ) ) {
            return new WP_Error( 'no_method', __( 'Please provide Withdraw method.', 'dokan-lite' ), [ 'status' => 400 ] );
        }

        if ( ! in_array( $method, dokan_withdraw_get_active_methods(), true ) ) {
            return new WP_Error( 'method_not_active', __( 'Method not active.', 'dokan-lite' ), [ 'status' => 400 ] );
        }

        $user_id = dokan_get_current_user_id();
        update_user_meta( $user_id, 'dokan_withdraw_default_method', $method );

        return new WP_REST_Response( __( 'Default method update successful.', 'dokan-lite' ), 200 );
    }

    /**
     * Get user data.
     *
     * @since 4.3.3
     *
     * @param int $user_id User ID.
     *
     * @return array
     */
    public function get_user_data( $user_id ) {
        $vendor = parent::get_user_data( $user_id );
        $vendor['balance'] = dokan_get_seller_balance( $user_id, false );

        return $vendor;
    }
}
