<?php // phpcs:ignore SlevomatCodingStandard.TypeHints.DeclareStrictTypes.DeclareStrictTypesMissing

namespace MailPoet\Cron\Workers;

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


use MailPoet\Config\Env;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Newsletter\Statistics\Export\StatisticsExporter;
use MailPoet\Router\Endpoints\ExportDownload;
use MailPoet\Subscribers\ImportExport\Export\Export;
use MailPoetVendor\Carbon\Carbon;

class ExportFilesCleanup extends SimpleWorker {
  const TASK_TYPE = 'export_files_cleanup';
  const DELETE_FILES_AFTER_X_DAYS = 1;
  const DELETE_STATS_FILES_AFTER_X_DAYS = 7;

  public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
    $this->cleanup(
      Export::getExportPath() . '/' . Export::getFilePrefix() . '*.*',
      self::DELETE_FILES_AFTER_X_DAYS
    );
    $this->cleanup(
      Env::$tempPath . '/' . Export::getFilePrefix() . '*.*',
      self::DELETE_FILES_AFTER_X_DAYS
    );
    $this->cleanup(
      ExportDownload::getExportDirectory() . '/' . StatisticsExporter::FILE_PREFIX . '*.*',
      self::DELETE_STATS_FILES_AFTER_X_DAYS
    );
    $this->cleanup(
      Env::$tempPath . '/' . StatisticsExporter::FILE_PREFIX . '*.*',
      self::DELETE_STATS_FILES_AFTER_X_DAYS
    );
    return true;
  }

  private function cleanup(string $globPattern, int $deleteAfterDays): void {
    $iterator = new \GlobIterator($globPattern);
    foreach ($iterator as $file) {
      if (is_string($file)) {
        continue;
      }
      $name = $file->getPathname();
      $created = $file->getMTime();
      $now = new Carbon();
      if (Carbon::createFromTimestamp((int)$created)->lessThan($now->subDays($deleteAfterDays))) {
        unlink($name);
      }
    }
  }
}