<?php

defined('ABSPATH') || exit;
class WC_Payment_Tokens
{
    public static function get_tokens($args)
    {
        $args = wp_parse_args($args, array('token_id' => '', 'user_id' => '', 'gateway_id' => '', 'type' => ''));
        $data_store = WC_Data_Store::load('payment-token');
        $token_results = $data_store->get_tokens($args);
        $tokens = array();
        if (!empty($token_results)) {
            foreach ($token_results as $token_result) {
                $_token = self::get($token_result->token_id, $token_result);
                if (!empty($_token)) {
                    $tokens[$token_result->token_id] = $_token;
                }
            }
        }
        return $tokens;
    }
    public static function get_customer_tokens($customer_id, $gateway_id = '')
    {
        if ($customer_id < 1) {
            return array();
        }
        $tokens = self::get_tokens(array('user_id' => $customer_id, 'gateway_id' => $gateway_id));
        return apply_filters('woocommerce_get_customer_payment_tokens', $tokens, $customer_id, $gateway_id);
    }
    public static function get_customer_default_token($customer_id)
    {
        if ($customer_id < 1) {
            return null;
        }
        $data_store = WC_Data_Store::load('payment-token');
        $token = $data_store->get_users_default_token($customer_id);
        if ($token) {
            return self::get($token->token_id, $token);
        } else {
            return null;
        }
    }
    public static function get_order_tokens($order_id)
    {
        $order = wc_get_order($order_id);
        if (!$order) {
            return array();
        }
        $token_ids = $order->get_payment_tokens();
        if (empty($token_ids)) {
            return array();
        }
        $tokens = self::get_tokens(array('token_id' => $token_ids));
        return apply_filters('woocommerce_get_order_payment_tokens', $tokens, $order_id);
    }
    public static function get($token_id, $token_result = null)
    {
        $data_store = WC_Data_Store::load('payment-token');
        if (is_null($token_result)) {
            $token_result = $data_store->get_token_by_id($token_id);
            if (empty($token_result)) {
                return null;
            }
        }
        $token_class = self::get_token_classname($token_result->type);
        if (class_exists($token_class)) {
            $meta = $data_store->get_metadata($token_id);
            $passed_meta = array();
            if (!empty($meta)) {
                foreach ($meta as $meta_key => $meta_value) {
                    $passed_meta[$meta_key] = $meta_value[0];
                }
            }
            return new $token_class($token_id, (array) $token_result, $passed_meta);
        }
        return null;
    }
    public static function delete($token_id)
    {
        $type = self::get_token_type_by_id($token_id);
        if (!empty($type)) {
            $class = self::get_token_classname($type);
            $token = new $class($token_id);
            $token->delete();
        }
    }
    public static function set_users_default($user_id, $token_id)
    {
        $data_store = WC_Data_Store::load('payment-token');
        $users_tokens = self::get_customer_tokens($user_id);
        foreach ($users_tokens as $token) {
            if ($token_id === $token->get_id()) {
                $data_store->set_default_status($token->get_id(), true);
                do_action('woocommerce_payment_token_set_default', $token_id, $token);
            } else {
                $data_store->set_default_status($token->get_id(), false);
            }
        }
    }
    public static function get_token_type_by_id($token_id)
    {
        $data_store = WC_Data_Store::load('payment-token');
        return $data_store->get_token_type_by_id($token_id);
    }
    protected static function get_token_classname($type)
    {
        return apply_filters('woocommerce_payment_token_class', 'WC_Payment_Token_' . $type, $type);
    }
}