<?php declare(strict_types = 1);

namespace MailPoet\Subscribers;

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


use MailPoet\Config\Renderer;
use MailPoet\Config\ServicesChecker;
use MailPoet\Mailer\MailerFactory;
use MailPoet\Mailer\MetaInfo;
use MailPoet\WP\Functions as WPFunctions;

class SubscriberLimitNotificationMailer {

  /** @var Renderer */
  private $renderer;

  /** @var WPFunctions */
  private $wp;

  /** @var MailerFactory */
  private $mailerFactory;

  /** @var MetaInfo */
  private $mailerMetaInfo;

  /** @var ServicesChecker */
  private $servicesChecker;

  public function __construct(
    Renderer $renderer,
    WPFunctions $wp,
    MailerFactory $mailerFactory,
    MetaInfo $mailerMetaInfo,
    ServicesChecker $servicesChecker
  ) {
    $this->renderer = $renderer;
    $this->wp = $wp;
    $this->mailerFactory = $mailerFactory;
    $this->mailerMetaInfo = $mailerMetaInfo;
    $this->servicesChecker = $servicesChecker;
  }

  public function send(int $threshold, int $count, int $limit, bool $hasValidApiKey): bool {
    $recipient = $this->getRecipient();
    if ($recipient === null) {
      return false;
    }

    $context = [
      'count' => $count,
      'limit' => $limit,
      'threshold' => $threshold,
      'hasValidApiKey' => $hasValidApiKey,
      'link_upgrade' => $this->getUpgradeLink($limit, $hasValidApiKey),
    ];

    $newsletter = [
      // translators: %d is the subscriber limit threshold percentage.
      'subject' => sprintf(__('Your MailPoet subscriber list is at %d%% of its limit', 'mailpoet'), $threshold),
      'body' => [
        'html' => $this->renderer->render('emails/subscriberLimitThresholdNotification.html', $context),
        'text' => $this->renderer->render('emails/subscriberLimitThresholdNotification.txt', $context),
      ],
    ];

    try {
      $result = $this->mailerFactory->getDefaultMailer()->send($newsletter, $recipient, [
        'meta' => $this->mailerMetaInfo->getSubscriberLimitNotificationMetaInfo(),
      ]);
    } catch (\Exception $e) {
      return false;
    }

    return (bool)($result['response'] ?? false);
  }

  private function getRecipient(): ?string {
    $recipient = $this->wp->sanitizeEmail((string)$this->wp->getOption('admin_email'));
    if ($recipient === '' || !$this->wp->isEmail($recipient)) {
      return null;
    }
    return $recipient;
  }

  private function getUpgradeLink(int $limit, bool $hasValidApiKey): string {
    if ($hasValidApiKey) {
      $partialApiKey = $this->servicesChecker->generatePartialApiKey();
      if ($partialApiKey !== '') {
        return 'https://account.mailpoet.com/orders/upgrade/' . $partialApiKey;
      }
    }

    return 'https://account.mailpoet.com/?s=' . ($limit + 1);
  }
}