<?php

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

function tilfy_youtube_gunluk_kota_hatasi_mi( $mesaj ) {
	$mesaj = strtolower( (string) $mesaj );
	if ( $mesaj === '' ) {
		return false;
	}
	if ( strpos( $mesaj, 'uploadlimitexceeded' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'exceeded the number of videos' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'daily upload limit' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'quota exceeded' ) !== false ) {
		return strpos( $mesaj, 'video uploads' ) !== false
			|| strpos( $mesaj, 'video uploads per day' ) !== false
			|| strpos( $mesaj, 'upload' ) !== false;
	}
	return false;
}

function tilfy_youtube_kota_hatasi_mi( $mesaj ) {
	return tilfy_youtube_gunluk_kota_hatasi_mi( $mesaj );
}

function tilfy_hiz_limit_hatasi_mi( $mesaj ) {
	$mesaj = strtolower( (string) $mesaj );
	if ( $mesaj === '' ) {
		return false;
	}
	if ( strpos( $mesaj, 'too many requests' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'http 429' ) !== false || strpos( $mesaj, 'http_429' ) !== false ) {
		return true;
	}
	if ( preg_match( '/\(#(4|17|32|613)\)/', $mesaj ) ) {
		return true;
	}
	if ( strpos( $mesaj, 'request limit reached' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'application request limit' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'user request limit' ) !== false ) {
		return true;
	}
	return false;
}

function tilfy_gecici_yukleme_hatasi_mi( $mesaj ) {
	$mesaj = strtolower( (string) $mesaj );
	if ( $mesaj === '' ) {
		return false;
	}
	if ( strpos( $mesaj, 'internal server error' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'bad gateway' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'service unavailable' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'gateway timeout' ) !== false ) {
		return true;
	}
	if ( preg_match( '/http\s*5\d{2}/', $mesaj ) ) {
		return true;
	}
	if ( strpos( $mesaj, 'timed out' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'curl error 28' ) !== false ) {
		return true;
	}
	if ( strpos( $mesaj, 'operation timed out' ) !== false ) {
		return true;
	}
	return false;
}

function tilfy_paylasim_gecici_hata_ertele( $paylasim_id, $platform, $dakika = 15 ) {
	return tilfy_paylasim_hiz_limit_ertele( $paylasim_id, $platform, $dakika );
}

function tilfy_paylasim_hiz_limit_ertele( $paylasim_id, $platform, $dakika = 15 ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	$dakika      = max( 5, min( 120, (int) $dakika ) );
	if ( $paylasim_id <= 0 ) {
		return '';
	}
	try {
		$dt = new DateTime( 'now', wp_timezone() );
		$dt->modify( '+' . $dakika . ' minutes' );
		$zaman = $dt->format( 'Y-m-d H:i:s' );
	} catch ( Exception $e ) {
		$zaman = gmdate( 'Y-m-d H:i:s', time() + ( $dakika * 60 ) );
	}
	$wpdb->update(
		tilfy_tablo( 'paylasim' ),
		array(
			'durum'       => 'zamanlandi',
			'zamanlama'   => $zaman,
			'hata_mesaji' => '',
			'guncelleme'  => current_time( 'mysql' ),
		),
		array( 'id' => $paylasim_id )
	);
	if ( function_exists( 'tilfy_paylasim_log_ekle' ) ) {
		tilfy_paylasim_log_ekle(
			$paylasim_id,
			'Gecici hata: ' . mysql2date( 'd.m.Y H:i', $zaman ) . ' icin yeniden zamanlandi',
			sanitize_key( (string) $platform ),
			'kuyruk'
		);
	}
	return $zaman;
}

function tilfy_youtube_ertesi_gun_baslangic() {
	$dt = new DateTime( 'tomorrow', wp_timezone() );
	$dt->setTime( 0, 10, 0 );
	return $dt->format( 'Y-m-d H:i:s' );
}

function tilfy_youtube_paylasim_ertele( $paylasim_id, $zaman = null ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return;
	}
	if ( $zaman === null || $zaman === '' ) {
		$zaman = tilfy_youtube_ertesi_gun_baslangic();
	}
	$wpdb->update(
		tilfy_tablo( 'paylasim' ),
		array(
			'durum'       => 'zamanlandi',
			'zamanlama'   => $zaman,
			'hata_mesaji' => '',
			'guncelleme'  => current_time( 'mysql' ),
		),
		array( 'id' => $paylasim_id )
	);
	if ( function_exists( 'tilfy_paylasim_log_ekle' ) ) {
		tilfy_paylasim_log_ekle(
			$paylasim_id,
			'YouTube gunluk yukleme limiti: ' . mysql2date( 'd.m.Y H:i', $zaman ) . ' icin zamanlandi',
			'youtube',
			'kuyruk'
		);
	}
}

function tilfy_youtube_bekleyen_kuyruk_youtube_ertele( $baslangic = null ) {
	global $wpdb;
	if ( $baslangic === null || $baslangic === '' ) {
		$baslangic = tilfy_youtube_ertesi_gun_baslangic();
	}
	$satirlar = $wpdb->get_results(
		"SELECT id, payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'paylasim_gonder' AND durum = 'beklemede'"
	);
	$simdi = current_time( 'mysql' );
	foreach ( (array) $satirlar as $is ) {
		$payload = json_decode( (string) $is->payload, true );
		if ( ! is_array( $payload ) || sanitize_key( (string) ( $payload['platform'] ?? '' ) ) !== 'youtube' ) {
			continue;
		}
		$pid = (int) ( $payload['paylasim_id'] ?? 0 );
		if ( $pid > 0 ) {
			tilfy_youtube_paylasim_ertele( $pid, $baslangic );
		}
		$wpdb->update(
			tilfy_tablo( 'kuyruk' ),
			array(
				'durum'      => 'tamam',
				'guncelleme' => $simdi,
			),
			array( 'id' => (int) $is->id )
		);
	}
}

function tilfy_youtube_bugun_kalan_ertele( $baslangic = null ) {
	global $wpdb;
	if ( $baslangic === null || $baslangic === '' ) {
		$baslangic = tilfy_youtube_ertesi_gun_baslangic();
	}
	try {
		$bitis = new DateTime( 'today', wp_timezone() );
		$bitis->setTime( 23, 59, 59 );
		$bitis_mysql = $bitis->format( 'Y-m-d H:i:s' );
	} catch ( Exception $e ) {
		$bitis_mysql = current_time( 'Y-m-d' ) . ' 23:59:59';
	}
	$idler = $wpdb->get_col(
		$wpdb->prepare(
			"SELECT id FROM " . tilfy_tablo( 'paylasim' ) . " WHERE hedef_platform = 'youtube' AND durum IN ('zamanlandi','beklemede','yukleniyor') AND (zamanlama IS NULL OR zamanlama <= %s)",
			$bitis_mysql
		)
	);
	foreach ( (array) $idler as $id ) {
		tilfy_youtube_paylasim_ertele( (int) $id, $baslangic );
		if ( function_exists( 'tilfy_kuyruk_paylasim_iptal' ) ) {
			tilfy_kuyruk_paylasim_iptal( (int) $id );
		}
	}
}

function tilfy_youtube_kota_tum_ertele( $baslangic = null ) {
	if ( $baslangic === null || $baslangic === '' ) {
		$baslangic = tilfy_youtube_ertesi_gun_baslangic();
	}
	tilfy_youtube_bekleyen_kuyruk_youtube_ertele( $baslangic );
	tilfy_youtube_bugun_kalan_ertele( $baslangic );
}

function tilfy_youtube_kota_ertele_yanit( $paylasim_id, $mesaj, $hata_mesaji = '' ) {
	tilfy_youtube_paylasim_ertele( $paylasim_id );
	$ham = strtolower( (string) ( $hata_mesaji !== '' ? $hata_mesaji : $mesaj ) );
	if (
		strpos( $ham, 'uploadlimitexceeded' ) !== false
		|| strpos( $ham, 'daily upload limit' ) !== false
		|| strpos( $ham, 'exceeded the number of videos' ) !== false
	) {
		tilfy_youtube_kota_tum_ertele();
	}
	return array(
		'ok'        => true,
		'mesaj'     => $mesaj,
		'ertelendi' => true,
	);
}

function tilfy_zamanlanmis_youtube_kuyruga_al() {
	if ( function_exists( 'tilfy_zamanlanmis_paylasim_kuyruga_al' ) ) {
		tilfy_zamanlanmis_paylasim_kuyruga_al();
	}
}

function tilfy_youtube_paylasim_sonrasi_kota( $paylasim_id, $sonuc ) {
	if ( ! empty( $sonuc['ok'] ) ) {
		return $sonuc;
	}
	$mesaj = (string) ( $sonuc['mesaj'] ?? '' );
	if ( ! tilfy_youtube_gunluk_kota_hatasi_mi( $mesaj ) ) {
		return $sonuc;
	}
	return tilfy_youtube_kota_ertele_yanit(
		$paylasim_id,
		'YouTube gunluk video yukleme limiti; yarin icin zamanlandi',
		$mesaj
	);
}
