<?php

declare(strict_types=1);

namespace Gfdhfhgfgg\Testproject\Task;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Scheduler\Task\AbstractTask;

/**
 * Özel Temizlik Görevi
 *
 * Bu görev:
 * - Süresi geçmiş sayfa önbelleklerini temizler
 * - Silinmiş (deleted=1) kayıtları veritabanından kaldırır
 * - Eski sys_log kayıtlarını temizler
 *
 * Backend: System > Scheduler modülünden eklenebilir
 * Cron: Her gün gece 02:00'de çalıştırılacak şekilde ayarlanabilir
 */
class CleanupTask extends AbstractTask
{
    /**
     * Kaç günden eski sys_log kayıtları silinsin?
     * Backend'den yapılandırılabilir.
     */
    public int $logRetentionDays = 30;

    /**
     * Kaç günden eski tx_scheduler_task kayıtları silinsin?
     */
    public int $schedulerLogRetentionDays = 90;

    /**
     * Görevin ana çalışma metodu.
     * true: başarılı, false: hatalı
     */
    public function execute(): bool
    {
        try {
            $this->cleanupSysLog();
            $this->cleanupDeletedRecords();

            return true;
        } catch (\Throwable $e) {
            // Hata durumunda false döndür — Scheduler "failed" olarak işaretler
            return false;
        }
    }


    /**
     * sys_log tablosunu temizle.
     * Belirtilen günden eski kayıtları sil.
     */
    protected function cleanupSysLog(): void
    {
        $cutoffTimestamp = time() - ($this->logRetentionDays * 86400);

        $connection = GeneralUtility::makeInstance(ConnectionPool::class)
            ->getConnectionForTable('sys_log');

        $connection->delete(
            'sys_log',
            ['tstamp < ' . $cutoffTimestamp],
            [\Doctrine\DBAL\ParameterType::INTEGER]
        );
    }

    /**
     * deleted=1 olan kayıtları gerçekten sil.
     * Temizlenecek tablolar listesi.
     */
    protected function cleanupDeletedRecords(): void
    {
        $tablesToClean = [
            'tt_content',
            'pages',
            'sys_file_reference',
        ];

        foreach ($tablesToClean as $table) {
            // Tablonun 'deleted' alanı var mı kontrol et
            if (!isset($GLOBALS['TCA'][$table]['ctrl']['delete'])) {
                continue;
            }

            $deleteField = $GLOBALS['TCA'][$table]['ctrl']['delete'];

            $connection = GeneralUtility::makeInstance(ConnectionPool::class)
                ->getConnectionForTable($table);

            $connection->delete(
                $table,
                [$deleteField => 1],
                [\Doctrine\DBAL\ParameterType::INTEGER]
            );
        }
    }

    /**
     * Backend'de görev listesinde gösterilecek ek bilgi.
     */
    public function getAdditionalInformation(): string
    {
        return sprintf(
            'Log temizleme: %d gün | Tablo temizleme: tt_content, pages, sys_file_reference',
            $this->logRetentionDays
        );
    }
}
