<?php declare(strict_types = 1);

namespace MailPoet\Automation\Integrations\WooCommerce\SubjectTransformers;

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


use MailPoet\Automation\Engine\Data\Subject;
use MailPoet\Automation\Engine\Integration\SubjectTransformer;
use MailPoet\Automation\Engine\WordPress;
use MailPoet\Automation\Integrations\WooCommerce\Subjects\OrderSubject;
use MailPoet\Automation\Integrations\WooCommerce\WooCommerce;
use MailPoet\Automation\Integrations\WordPress\Subjects\UserSubject;

class OrderSubjectToWordPressUserSubjectTransformer implements SubjectTransformer {
  /** @var WooCommerce */
  private $wooCommerce;

  /** @var WordPress */
  private $wordPress;

  public function __construct(
    WooCommerce $wooCommerce,
    WordPress $wordPress
  ) {
    $this->wooCommerce = $wooCommerce;
    $this->wordPress = $wordPress;
  }

  public function accepts(): string {
    return OrderSubject::KEY;
  }

  public function returns(): string {
    return UserSubject::KEY;
  }

  public function transform(Subject $data): ?Subject {
    if ($this->accepts() !== $data->getKey()) {
      throw new \InvalidArgumentException('Invalid subject type');
    }

    $orderId = (int)($data->getArgs()['order_id'] ?? 0);
    if ($orderId <= 0) {
      return null;
    }

    $order = $this->wooCommerce->wcGetOrder($orderId);
    if (!$order instanceof \WC_Order) {
      return null;
    }

    $userId = $order->get_user_id();
    if ($userId <= 0) {
      return null;
    }

    $user = $this->wordPress->getUserBy('id', $userId);
    if (!$user instanceof \WP_User || !$user->exists()) {
      return null;
    }

    return new Subject(UserSubject::KEY, ['user_id' => $userId]);
  }
}