<?php

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

function tilfy_otomasyon_medya_formatlari() {
	return array(
		'tumu'   => tilfy__( 'Video + görsel' ),
		'video'  => tilfy__( 'Yalnız video' ),
		'gorsel' => tilfy__( 'Yalnız görsel' ),
	);
}

function tilfy_otomasyon_tip_listesi() {
	return apply_filters(
		'tilfy_otomasyon_tip_listesi',
		array(
			'capraz' => tilfy__( 'Çapraz paylaşım' ),
		)
	);
}

function tilfy_otomasyon_tip_etiket( $tip ) {
	$tip  = sanitize_key( (string) $tip );
	$list = tilfy_otomasyon_tip_listesi();
	if ( isset( $list[ $tip ] ) ) {
		return (string) $list[ $tip ];
	}
	return $tip !== '' ? $tip : 'capraz';
}

function tilfy_otomasyon_listele() {
	global $wpdb;
	return $wpdb->get_results(
		'SELECT * FROM ' . tilfy_tablo( 'otomasyon' ) . ' ORDER BY aktif DESC, id DESC'
	);
}

function tilfy_otomasyon_al( $id ) {
	global $wpdb;
	$id = (int) $id;
	if ( $id <= 0 ) {
		return null;
	}
	return $wpdb->get_row(
		$wpdb->prepare(
			'SELECT * FROM ' . tilfy_tablo( 'otomasyon' ) . ' WHERE id = %d',
			$id
		)
	);
}

function tilfy_otomasyon_hedefleri_coz( $satir ) {
	if ( is_object( $satir ) ) {
		$ham = (string) ( $satir->hedef_platformlar ?? '' );
	} else {
		$ham = (string) $satir;
	}
	$liste = json_decode( $ham, true );
	if ( ! is_array( $liste ) ) {
		return array();
	}
	return array_values(
		array_filter(
			array_map( 'sanitize_key', $liste ),
			'tilfy_platform_aktif_mi'
		)
	);
}

function tilfy_otomasyon_platform_ayar_coz( $satir ) {
	if ( is_object( $satir ) ) {
		$ham = (string) ( $satir->platform_ayar ?? '' );
	} else {
		$ham = (string) $satir;
	}
	$ayar = json_decode( $ham, true );
	return is_array( $ayar ) ? $ayar : array();
}

function tilfy_otomasyon_kaydet( $veri ) {
	global $wpdb;
	$veri  = apply_filters( 'tilfy_otomasyon_kaydet_veri', is_array( $veri ) ? $veri : array() );
	$simdi = current_time( 'mysql' );
	$id    = (int) ( $veri['id'] ?? 0 );

	$tipler = tilfy_otomasyon_tip_listesi();
	$tip    = sanitize_key( (string) ( $veri['tip'] ?? 'capraz' ) );
	if ( $tip === '' || ! isset( $tipler[ $tip ] ) ) {
		$tip = 'capraz';
	}

	$kaynak = sanitize_key( (string) ( $veri['kaynak_platform'] ?? '' ) );
	if ( $tip === 'capraz' ) {
		if ( ! tilfy_platform_aktif_mi( $kaynak ) || ( function_exists( 'tilfy_platform_kaynak_mi' ) && ! tilfy_platform_kaynak_mi( $kaynak ) ) ) {
			return 0;
		}
	} elseif ( $kaynak === '' ) {
		$kaynak = $tip;
	}

	$medya_format = sanitize_key( (string) ( $veri['medya_format'] ?? 'tumu' ) );
	if ( ! in_array( $medya_format, array( 'tumu', 'video', 'gorsel' ), true ) ) {
		$medya_format = 'tumu';
	}

	$hedef_filtre = function ( $platform ) {
		if ( ! tilfy_platform_aktif_mi( $platform ) ) {
			return false;
		}
		if ( function_exists( 'tilfy_platform_hedef_mi' ) && ! tilfy_platform_hedef_mi( $platform ) ) {
			return false;
		}
		return true;
	};
	$hedefler = array_values(
		array_filter(
			array_map( 'sanitize_key', (array) ( $veri['hedef_platformlar'] ?? array() ) ),
			$hedef_filtre
		)
	);
	if ( $tip === 'capraz' ) {
		$hedefler = array_values( array_diff( $hedefler, array( $kaynak ) ) );
	}
	if ( empty( $hedefler ) ) {
		return 0;
	}

	$gecikme = (float) ( $veri['gecikme_saat'] ?? 0 );
	if ( $gecikme < 0 ) {
		$gecikme = 0;
	}

	$kontrol = (int) ( $veri['kontrol_dakika'] ?? 15 );
	$kontrol = max( 5, min( 1440, $kontrol ) );

	$islem_adedi = (int) ( $veri['islem_adedi'] ?? 1 );
	$islem_adedi = max( 1, min( 20, $islem_adedi ) );

	$arasi = (int) ( $veri['paylasim_arasi_dakika'] ?? 0 );
	$arasi = max( 0, min( 1440, $arasi ) );

	$gunluk = (int) ( $veri['gunluk_adet'] ?? 1 );
	$gunluk = max( 1, min( 50, $gunluk ) );

	$baslangic = tilfy_otomasyon_baslangic_tarihi_temizle( $veri['baslangic_tarihi'] ?? '' );

	$platform_ayar = array();
	if ( ! empty( $veri['platform_ayar'] ) && is_array( $veri['platform_ayar'] ) ) {
		foreach ( $veri['platform_ayar'] as $pl => $kart ) {
			$pl = sanitize_key( $pl );
			if ( ! in_array( $pl, $hedefler, true ) || ! is_array( $kart ) ) {
				continue;
			}
			$platform_ayar[ $pl ] = function_exists( 'tilfy_paylasim_ayar_temizle' )
				? tilfy_paylasim_ayar_temizle( $pl, $kart )
				: $kart;
		}
	}

	$satir = array(
		'ad'                    => sanitize_text_field( (string) ( $veri['ad'] ?? '' ) ),
		'aktif'                 => ! empty( $veri['aktif'] ) ? 1 : 0,
		'tip'                   => $tip,
		'kaynak_platform'       => $kaynak,
		'medya_format'          => $medya_format,
		'gecikme_saat'          => $gecikme,
		'hedef_platformlar'     => wp_json_encode( $hedefler ),
		'platform_ayar'         => wp_json_encode( $platform_ayar ),
		'kontrol_dakika'        => $kontrol,
		'islem_adedi'           => $islem_adedi,
		'paylasim_arasi_dakika' => $arasi,
		'gunluk_adet'           => $gunluk,
		'baslangic_tarihi'      => $baslangic,
		'guncelleme'            => $simdi,
	);

	if ( $id > 0 ) {
		$wpdb->update( tilfy_tablo( 'otomasyon' ), $satir, array( 'id' => $id ) );
		return $id;
	}

	$satir['olusturulma'] = $simdi;
	$satir['son_kontrol'] = null;
	$wpdb->insert( tilfy_tablo( 'otomasyon' ), $satir );
	return (int) $wpdb->insert_id;
}

function tilfy_otomasyon_sil( $id ) {
	global $wpdb;
	$id = (int) $id;
	if ( $id <= 0 ) {
		return false;
	}
	$wpdb->delete( tilfy_tablo( 'otomasyon_kayit' ), array( 'otomasyon_id' => $id ) );
	$wpdb->delete( tilfy_tablo( 'otomasyon_batch' ), array( 'otomasyon_id' => $id ) );
	$wpdb->delete( tilfy_tablo( 'otomasyon' ), array( 'id' => $id ) );
	return true;
}

function tilfy_otomasyon_post_verisi() {
	$tip = isset( $_POST['tip'] ) ? sanitize_key( wp_unslash( $_POST['tip'] ) ) : 'capraz';
	$hedef = array();
	if ( ! empty( $_POST['hedef_platformlar'] ) && is_array( $_POST['hedef_platformlar'] ) ) {
		$hedef = array_map( 'sanitize_key', (array) wp_unslash( $_POST['hedef_platformlar'] ) );
	} elseif ( ! empty( $_POST['hedef_platform'] ) ) {
		$hedef = array( sanitize_key( wp_unslash( $_POST['hedef_platform'] ) ) );
	}
	$platform_ayar = array();
	if ( ! empty( $_POST['platform_ayar'] ) && is_array( $_POST['platform_ayar'] ) ) {
		$platform_ayar = function_exists( 'tilfy_post_platform_ayar_temizle' )
			? tilfy_post_platform_ayar_temizle( wp_unslash( $_POST['platform_ayar'] ) )
			: array();
	}
	$medya_format = isset( $_POST['medya_format'] ) ? sanitize_key( wp_unslash( $_POST['medya_format'] ) ) : 'tumu';
	if ( ! in_array( $medya_format, array( 'tumu', 'video', 'gorsel' ), true ) ) {
		$medya_format = 'tumu';
	}
	$kontrol = isset( $_POST['kontrol_dakika'] ) ? absint( wp_unslash( $_POST['kontrol_dakika'] ) ) : 15;
	$kontrol = max( 5, min( 1440, $kontrol ) );
	$baslangic = isset( $_POST['baslangic_tarihi'] ) ? sanitize_text_field( wp_unslash( $_POST['baslangic_tarihi'] ) ) : '';
	$baslangic = tilfy_otomasyon_baslangic_tarihi_temizle( $baslangic );
	if ( $baslangic === null ) {
		$baslangic = '';
	}
	return array(
		'id'                    => isset( $_POST['otomasyon_id'] ) ? absint( $_POST['otomasyon_id'] ) : 0,
		'ad'                    => isset( $_POST['ad'] ) ? sanitize_text_field( wp_unslash( $_POST['ad'] ) ) : '',
		'tip'                   => $tip,
		'aktif'                 => ! empty( $_POST['aktif'] ),
		'kaynak_platform'       => isset( $_POST['kaynak_platform'] ) ? sanitize_key( wp_unslash( $_POST['kaynak_platform'] ) ) : '',
		'medya_format'          => $medya_format,
		'gecikme_saat'          => isset( $_POST['gecikme_saat'] ) ? (float) wp_unslash( $_POST['gecikme_saat'] ) : 0,
		'kontrol_dakika'        => $kontrol,
		'islem_adedi'           => isset( $_POST['islem_adedi'] ) ? absint( wp_unslash( $_POST['islem_adedi'] ) ) : 1,
		'paylasim_arasi_dakika' => isset( $_POST['paylasim_arasi_dakika'] ) ? absint( wp_unslash( $_POST['paylasim_arasi_dakika'] ) ) : 0,
		'gunluk_adet'           => isset( $_POST['gunluk_adet'] ) ? absint( wp_unslash( $_POST['gunluk_adet'] ) ) : 1,
		'baslangic_tarihi'      => $baslangic,
		'hedef_platformlar'     => $hedef,
		'platform_ayar'         => $platform_ayar,
	);
}

function tilfy_otomasyon_kontrol_zamani_geldi( $kural ) {
	if ( ! $kural || empty( $kural->aktif ) ) {
		return false;
	}
	$dakika = max( 5, (int) ( $kural->kontrol_dakika ?? 15 ) );
	if ( empty( $kural->son_kontrol ) ) {
		return true;
	}
	$son  = strtotime( (string) $kural->son_kontrol );
	$simdi = (int) current_time( 'timestamp' );
	if ( ! $son ) {
		return true;
	}
	return ( $simdi - $son ) >= ( $dakika * 60 );
}

function tilfy_otomasyon_son_kontrol_guncelle( $otomasyon_id ) {
	global $wpdb;
	$wpdb->update(
		tilfy_tablo( 'otomasyon' ),
		array(
			'son_kontrol' => current_time( 'mysql' ),
			'guncelleme'  => current_time( 'mysql' ),
		),
		array( 'id' => (int) $otomasyon_id )
	);
}

function tilfy_otomasyon_medya_format_sql( $format ) {
	$format = sanitize_key( (string) $format );
	if ( $format === 'gorsel' ) {
		return " AND LOWER(i.medya_tipi) IN ('image','photo','carousel_album','gorsel','thumbnail','album')";
	}
	if ( $format === 'video' ) {
		return " AND LOWER(i.medya_tipi) NOT IN ('image','photo','carousel_album','gorsel','thumbnail','album')";
	}
	return '';
}

function tilfy_otomasyon_icerik_tarihi( $icerik ) {
	$tarih = (string) ( $icerik->kaynak_tarihi ?? '' );
	if ( $tarih === '' ) {
		$tarih = (string) ( $icerik->olusturulma ?? '' );
	}
	return $tarih;
}

function tilfy_otomasyon_baslangic_tarihi_temizle( $girdi ) {
	$girdi = trim( (string) $girdi );
	if ( $girdi === '' ) {
		return null;
	}
	$dt = DateTime::createFromFormat( 'Y-m-d', $girdi, wp_timezone() );
	if ( ! $dt || $dt->format( 'Y-m-d' ) !== $girdi ) {
		return null;
	}
	return $girdi;
}

function tilfy_otomasyon_baslangic_tarihi( $kural ) {
	if ( ! $kural ) {
		return null;
	}
	$tarih = trim( (string) ( $kural->baslangic_tarihi ?? '' ) );
	if ( $tarih === '' || $tarih === '0000-00-00' ) {
		return null;
	}
	return tilfy_otomasyon_baslangic_tarihi_temizle( $tarih );
}

function tilfy_otomasyon_icerik_kaynak_gunu( $icerik ) {
	$tarih = tilfy_otomasyon_icerik_tarihi( $icerik );
	if ( $tarih === '' ) {
		return '';
	}
	return mysql2date( 'Y-m-d', $tarih );
}

function tilfy_otomasyon_icerik_baslangic_uygun_mu( $kural, $icerik ) {
	$min = tilfy_otomasyon_baslangic_tarihi( $kural );
	if ( $min === null ) {
		return true;
	}
	$gun = tilfy_otomasyon_icerik_kaynak_gunu( $icerik );
	if ( $gun === '' ) {
		return false;
	}
	return $gun >= $min;
}

function tilfy_otomasyon_premiere_aktif_mi( $kural ) {
	return max( 0, (int) ( $kural->paylasim_arasi_dakika ?? 0 ) ) > 0;
}

function tilfy_otomasyon_arasi_dakika( $kural ) {
	return max( 0, min( 1440, (int) ( $kural->paylasim_arasi_dakika ?? 0 ) ) );
}

function tilfy_otomasyon_gunluk_adet( $kural ) {
	return max( 1, min( 50, (int) ( $kural->gunluk_adet ?? 1 ) ) );
}

function tilfy_otomasyon_rezerve_icerik_ids( $haric_otomasyon_id = 0 ) {
	global $wpdb;
	$haric = (int) $haric_otomasyon_id;
	if ( $haric > 0 ) {
		$ids = array_map(
			'intval',
			(array) $wpdb->get_col(
				$wpdb->prepare(
					'SELECT DISTINCT icerik_id FROM ' . tilfy_tablo( 'otomasyon_kayit' ) . ' WHERE otomasyon_id != %d',
					$haric
				)
			)
		);
	} else {
		$ids = array_map( 'intval', (array) $wpdb->get_col( 'SELECT DISTINCT icerik_id FROM ' . tilfy_tablo( 'otomasyon_kayit' ) ) );
	}
	$batch_t = tilfy_tablo( 'otomasyon_batch' );
	if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $batch_t ) ) !== $batch_t ) {
		return array_values( array_unique( array_filter( $ids ) ) );
	}
	$satirlar = $wpdb->get_results(
		"SELECT icerik_ids, ek_veri FROM {$batch_t} WHERE durum IN ('bekliyor','planlandi')"
	);
	foreach ( (array) $satirlar as $satir ) {
		$ek = tilfy_otomasyon_batch_ek_veri_coz( $satir );
		if ( ( $ek['mod'] ?? '' ) === 'paylasim_sirali' ) {
			continue;
		}
		$liste = json_decode( (string) ( $satir->icerik_ids ?? '' ), true );
		if ( is_array( $liste ) ) {
			foreach ( $liste as $cid ) {
				$ids[] = (int) $cid;
			}
		}
	}
	return array_values( array_unique( array_filter( $ids ) ) );
}

function tilfy_otomasyon_icerik_rezerve_mi( $icerik_id, $haric_otomasyon_id = 0 ) {
	return in_array( (int) $icerik_id, tilfy_otomasyon_rezerve_icerik_ids( $haric_otomasyon_id ), true );
}

function tilfy_otomasyon_batch_icerik_ids_coz( $satir ) {
	$liste = json_decode( (string) ( $satir->icerik_ids ?? '' ), true );
	return is_array( $liste ) ? array_values( array_filter( array_map( 'intval', $liste ) ) ) : array();
}

function tilfy_otomasyon_batch_paylasim_ids_coz( $satir ) {
	$liste = json_decode( (string) ( $satir->paylasim_ids ?? '' ), true );
	return is_array( $liste ) ? array_values( array_filter( array_map( 'intval', $liste ) ) ) : array();
}

function tilfy_otomasyon_batch_al( $batch_id ) {
	global $wpdb;
	$batch_id = (int) $batch_id;
	if ( $batch_id <= 0 ) {
		return null;
	}
	return $wpdb->get_row(
		$wpdb->prepare( 'SELECT * FROM ' . tilfy_tablo( 'otomasyon_batch' ) . ' WHERE id = %d', $batch_id )
	);
}

function tilfy_otomasyon_batch_aktif_var( $otomasyon_id ) {
	global $wpdb;
	$otomasyon_id = (int) $otomasyon_id;
	$satirlar = $wpdb->get_results(
		$wpdb->prepare(
			'SELECT * FROM ' . tilfy_tablo( 'otomasyon_batch' ) . " WHERE otomasyon_id = %d AND durum = 'planlandi' ORDER BY id ASC",
			$otomasyon_id
		)
	);
	foreach ( (array) $satirlar as $batch ) {
		if ( tilfy_otomasyon_batch_paylasim_bekliyor_mu( $batch ) ) {
			return true;
		}
	}
	return false;
}

function tilfy_otomasyon_batch_kural_mesgul( $otomasyon_id ) {
	global $wpdb;
	$otomasyon_id = (int) $otomasyon_id;
	if ( $otomasyon_id <= 0 ) {
		return false;
	}
	$cnt = (int) $wpdb->get_var(
		$wpdb->prepare(
			"SELECT COUNT(*) FROM " . tilfy_tablo( 'otomasyon_batch' ) . " WHERE otomasyon_id = %d AND durum IN ('bekliyor','planlandi')",
			$otomasyon_id
		)
	);
	return $cnt > 0;
}

function tilfy_otomasyon_batch_son_dalga_ids_coz( $satir ) {
	$liste = json_decode( (string) ( $satir->son_dalga_paylasim_ids ?? '' ), true );
	return is_array( $liste ) ? array_values( array_filter( array_map( 'intval', $liste ) ) ) : array();
}

function tilfy_otomasyon_batch_ek_veri_coz( $satir ) {
	$ek = json_decode( (string) ( $satir->ek_veri ?? '' ), true );
	return is_array( $ek ) ? $ek : array();
}

function tilfy_otomasyon_batch_kural_coz( $batch ) {
	$oid = (int) ( $batch->otomasyon_id ?? 0 );
	if ( $oid > 0 ) {
		return tilfy_otomasyon_al( $oid );
	}
	$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
	$arasi = max(
		0,
		(int) ( $ek['paylasim_arasi_dakika'] ?? 0 ),
		is_array( $ek['ortak'] ?? null ) ? (int) ( $ek['ortak']['paylasim_arasi_dakika'] ?? 0 ) : 0
	);
	return (object) array(
		'id'                    => 0,
		'paylasim_arasi_dakika' => $arasi,
		'gecikme_saat'          => 0,
		'kaynak_platform'       => sanitize_key( (string) ( $ek['kaynak_platform'] ?? '' ) ),
	);
}

function tilfy_otomasyon_batch_paylasim_ids_bekliyor_mu( $paylasim_ids ) {
	global $wpdb;
	$in = tilfy_sql_in_ints( $paylasim_ids );
	if ( ! $in ) {
		return false;
	}
	$adet = (int) $wpdb->get_var(
		$wpdb->prepare(
			'SELECT COUNT(*) FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND durum IN ('zamanlandi','beklemede','yukleniyor','sirada')",
			$in['degerler']
		)
	);
	return $adet > 0;
}

function tilfy_otomasyon_batch_son_dalga_bekliyor_mu( $batch ) {
	return tilfy_otomasyon_batch_paylasim_ids_bekliyor_mu( tilfy_otomasyon_batch_son_dalga_ids_coz( $batch ) );
}

function tilfy_otomasyon_batch_dalga_bitis_ts( $paylasim_ids ) {
	global $wpdb;
	$in = tilfy_sql_in_ints( $paylasim_ids );
	if ( ! $in ) {
		return (int) current_time( 'timestamp' );
	}
	$son = $wpdb->get_var(
		$wpdb->prepare(
			'SELECT MAX(guncelleme) FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND durum IN ('yuklendi','manuel_bekliyor','hata')",
			$in['degerler']
		)
	);
	if ( ! $son ) {
		return (int) current_time( 'timestamp' );
	}
	$ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( (string) $son ) : strtotime( (string) $son );
	return $ts > 0 ? $ts : (int) current_time( 'timestamp' );
}

function tilfy_otomasyon_batch_devam_ediyor_mu( $batch ) {
	global $wpdb;
	if ( ! $batch || sanitize_key( (string) ( $batch->durum ?? '' ) ) !== 'planlandi' ) {
		return false;
	}
	$toplam     = count( tilfy_otomasyon_batch_icerik_ids_coz( $batch ) );
	$baslatilan = (int) ( $batch->baslatilan_sira ?? 0 );
	if ( $baslatilan < $toplam ) {
		return true;
	}
	if ( tilfy_otomasyon_batch_son_dalga_bekliyor_mu( $batch ) ) {
		return true;
	}
	if ( tilfy_otomasyon_batch_paylasim_ids_bekliyor_mu( tilfy_otomasyon_batch_paylasim_ids_coz( $batch ) ) ) {
		return true;
	}
	$in = tilfy_sql_in_ints( tilfy_otomasyon_batch_paylasim_ids_coz( $batch ) );
	if ( $in ) {
		$sirada = (int) $wpdb->get_var(
			$wpdb->prepare(
				'SELECT COUNT(*) FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND durum = 'sirada'",
				$in['degerler']
			)
		);
		if ( $sirada > 0 ) {
			return true;
		}
	}
	$bekleme = trim( (string) ( $batch->bekleme_bitis ?? '' ) );
	if ( $bekleme !== '' ) {
		$ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( $bekleme ) : strtotime( $bekleme );
		if ( $ts > (int) current_time( 'timestamp' ) ) {
			return true;
		}
	}
	return false;
}

function tilfy_otomasyon_batch_paylasim_bekliyor_mu( $batch ) {
	return tilfy_otomasyon_batch_devam_ediyor_mu( $batch );
}

function tilfy_otomasyon_batch_bitis_ts( $batch ) {
	global $wpdb;
	if ( ! $batch ) {
		return 0;
	}
	$ids = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
	if ( empty( $ids ) ) {
		$ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( (string) ( $batch->guncelleme ?? '' ) ) : strtotime( (string) ( $batch->guncelleme ?? '' ) );
		return $ts > 0 ? $ts : (int) current_time( 'timestamp' );
	}
	$in = tilfy_sql_in_ints( $ids );
	if ( ! $in ) {
		$ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( (string) ( $batch->guncelleme ?? '' ) ) : strtotime( (string) ( $batch->guncelleme ?? '' ) );
		return $ts > 0 ? $ts : (int) current_time( 'timestamp' );
	}
	$son = $wpdb->get_var(
		$wpdb->prepare(
			'SELECT MAX(guncelleme) FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND durum IN ('yuklendi','manuel_bekliyor','hata')",
			$in['degerler']
		)
	);
	if ( ! $son ) {
		return 0;
	}
	$ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( (string) $son ) : strtotime( (string) $son );
	return $ts > 0 ? $ts : 0;
}

function tilfy_otomasyon_batch_onceki_tamamlanan( $otomasyon_id, $batch_id ) {
	global $wpdb;
	return $wpdb->get_row(
		$wpdb->prepare(
			'SELECT * FROM ' . tilfy_tablo( 'otomasyon_batch' ) . " WHERE otomasyon_id = %d AND durum = 'tamamlandi' AND id < %d ORDER BY id DESC LIMIT 1",
			(int) $otomasyon_id,
			(int) $batch_id
		)
	);
}

function tilfy_otomasyon_batch_anchor_ts( $kural, $batch ) {
	$oid = (int) ( $batch->otomasyon_id ?? 0 );
	if ( $oid <= 0 ) {
		$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
		if ( ! empty( $ek['baslangic_ts'] ) ) {
			return (int) $ek['baslangic_ts'];
		}
		$tarama = (string) ( $batch->tarama_zamani ?? '' );
		$ts     = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( $tarama ) : strtotime( $tarama );
		return $ts > 0 ? $ts : (int) current_time( 'timestamp' );
	}
	$gecikme_sn = (int) round( tilfy_otomasyon_gecikme_saat( $kural ) * 3600 );
	$onceki     = tilfy_otomasyon_batch_onceki_tamamlanan( (int) $kural->id, (int) $batch->id );
	if ( $onceki ) {
		$bitis = tilfy_otomasyon_batch_bitis_ts( $onceki );
		if ( $bitis > 0 ) {
			return $bitis + $gecikme_sn;
		}
	}
	$tarama = (string) ( $batch->tarama_zamani ?? '' );
	$ts     = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( $tarama ) : strtotime( $tarama );
	if ( $ts <= 0 ) {
		$ts = (int) current_time( 'timestamp' );
	}
	return $ts + $gecikme_sn;
}

function tilfy_otomasyon_slot_datetime( $ts ) {
	$ts = (int) $ts;
	if ( $ts <= 0 ) {
		return '';
	}
	try {
		$dt = new DateTime( '@' . $ts );
		$dt->setTimezone( wp_timezone() );
		return $dt->format( 'Y-m-d\TH:i' );
	} catch ( Exception $e ) {
		return '';
	}
}

function tilfy_otomasyon_batch_olustur( $kural, $icerikler, $durum = 'bekliyor' ) {
	global $wpdb;
	$simdi = current_time( 'mysql' );
	$ids   = array();
	foreach ( (array) $icerikler as $icerik ) {
		$ids[] = (int) ( is_object( $icerik ) ? $icerik->id : $icerik );
	}
	$ids = array_values( array_filter( $ids ) );
	if ( empty( $ids ) ) {
		return 0;
	}
	$ek_veri = '';
	if ( function_exists( 'tilfy_otomasyon_premiere_aktif_mi' ) && tilfy_otomasyon_premiere_aktif_mi( $kural ) ) {
		$ek_veri = wp_json_encode(
			array(
				'gunluk_adet'           => tilfy_otomasyon_gunluk_adet( $kural ),
				'paylasim_arasi_dakika' => tilfy_otomasyon_arasi_dakika( $kural ),
			)
		);
	}
	$wpdb->insert(
		tilfy_tablo( 'otomasyon_batch' ),
		array(
			'otomasyon_id'           => (int) $kural->id,
			'durum'                  => sanitize_key( $durum ),
			'tarama_zamani'          => $simdi,
			'icerik_ids'             => wp_json_encode( $ids ),
			'paylasim_ids'           => '[]',
			'baslatilan_sira'        => 0,
			'son_dalga_paylasim_ids' => '[]',
			'bekleme_bitis'          => null,
			'ek_veri'                => $ek_veri,
			'olusturulma'            => $simdi,
			'guncelleme'             => $simdi,
		)
	);
	return (int) $wpdb->insert_id;
}

function tilfy_otomasyon_batch_durum_guncelle( $batch_id, $durum, $paylasim_ids = null, $ekstra = null ) {
	global $wpdb;
	$batch_id = (int) $batch_id;
	if ( $batch_id <= 0 ) {
		return;
	}
	$satir = array(
		'durum'      => sanitize_key( $durum ),
		'guncelleme' => current_time( 'mysql' ),
	);
	if ( $paylasim_ids !== null ) {
		$satir['paylasim_ids'] = wp_json_encode( array_values( array_filter( array_map( 'intval', (array) $paylasim_ids ) ) ) );
	}
	if ( is_array( $ekstra ) ) {
		if ( array_key_exists( 'baslatilan_sira', $ekstra ) ) {
			$satir['baslatilan_sira'] = max( 0, (int) $ekstra['baslatilan_sira'] );
		}
		if ( array_key_exists( 'son_dalga_paylasim_ids', $ekstra ) ) {
			$satir['son_dalga_paylasim_ids'] = wp_json_encode( array_values( array_filter( array_map( 'intval', (array) $ekstra['son_dalga_paylasim_ids'] ) ) ) );
		}
		if ( array_key_exists( 'bekleme_bitis', $ekstra ) ) {
			$satir['bekleme_bitis'] = $ekstra['bekleme_bitis'];
		}
	}
	$wpdb->update( tilfy_tablo( 'otomasyon_batch' ), $satir, array( 'id' => $batch_id ) );
}

function tilfy_otomasyon_batch_icerik_sirada_paylasim_ids( $batch, $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	$in        = tilfy_sql_in_ints( tilfy_otomasyon_batch_paylasim_ids_coz( $batch ) );
	if ( $icerik_id <= 0 || ! $in ) {
		return array();
	}
	return array_map(
		'intval',
		(array) $wpdb->get_col(
			$wpdb->prepare(
				'SELECT id FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND icerik_id = %d AND durum = 'sirada'",
				array_merge( $in['degerler'], array( $icerik_id ) )
			)
		)
	);
}

function tilfy_otomasyon_batch_sirada_aktif_et( $paylasim_ids, $batch = null, $hemen = false ) {
	global $wpdb;
	$ids   = array_values( array_filter( array_map( 'intval', (array) $paylasim_ids ) ) );
	$simdi = current_time( 'mysql' );
	$aktif = array();
	foreach ( $ids as $pid ) {
		$satir = $wpdb->get_row(
			$wpdb->prepare(
				'SELECT * FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id = %d AND durum = 'sirada'",
				$pid
			)
		);
		if ( ! $satir ) {
			continue;
		}
		$zamanlama = $satir->zamanlama;
		$yeni_durum = 'beklemede';
		$kuyruga    = true;
		if ( ! $hemen && $zamanlama && function_exists( 'tilfy_zamanlama_gelecek_mi' ) && tilfy_zamanlama_gelecek_mi( $zamanlama ) ) {
			$yeni_durum = 'zamanlandi';
			$kuyruga    = false;
		} else {
			$zamanlama = null;
		}
		$wpdb->update(
			tilfy_tablo( 'paylasim' ),
			array(
				'durum'       => $yeni_durum,
				'zamanlama'   => $zamanlama,
				'guncelleme'  => $simdi,
			),
			array( 'id' => $pid )
		);
		if ( $kuyruga && function_exists( 'tilfy_kuyruk_ekle' ) ) {
			tilfy_kuyruk_ekle(
				'paylasim_gonder',
				array(
					'paylasim_id' => $pid,
					'icerik_id'   => (int) $satir->icerik_id,
					'platform'    => sanitize_key( (string) $satir->hedef_platform ),
				)
			);
		}
		$aktif[] = $pid;
	}
	return $aktif;
}

function tilfy_otomasyon_batch_icerik_baslat( $batch, $kural, $icerik_id, $dalga_index = null ) {
	if ( ! $batch || ! function_exists( 'tilfy_capraz_paylasim_baslat' ) ) {
		return array();
	}
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return array();
	}
	$oid = (int) ( $batch->otomasyon_id ?? 0 );
	if ( $oid <= 0 ) {
		$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
		if ( ( $ek['mod'] ?? '' ) === 'paylasim_sirali' ) {
			return array();
		}
		$hedefler      = array_values( array_filter( array_map( 'sanitize_key', (array) ( $ek['hedef_platformlar'] ?? array() ) ) ) );
		$kaynak        = sanitize_key( (string) ( $ek['kaynak_platform'] ?? '' ) );
		$platform_ayar = is_array( $ek['platform_ayar'] ?? null ) ? $ek['platform_ayar'] : array();
		$ortak         = is_array( $ek['ortak'] ?? null ) ? $ek['ortak'] : array();
		$ortak['kaynak'] = sanitize_key( (string) ( $ortak['kaynak'] ?? 'manuel' ) );
		$zorla         = ! empty( $ek['zorla'] );
		$arka_plan     = ! empty( $ek['arka_plan'] );
		$baslatilan = (int) ( $batch->baslatilan_sira ?? 0 );
		$dalga      = $dalga_index !== null ? max( 0, (int) $dalga_index ) : $baslatilan;
		if ( $dalga === 0 && ! empty( $ek['baslangic_ts'] ) ) {
			$ts = (int) $ek['baslangic_ts'];
			if ( $ts > (int) current_time( 'timestamp' ) ) {
				$ortak['zamanlama'] = tilfy_otomasyon_slot_datetime( $ts );
			}
		} elseif ( $dalga > 0 ) {
			unset( $ortak['zamanlama'] );
			$ortak['sirali_bekle'] = true;
			$gunluk = max( 1, (int) ( $ek['gunluk_adet'] ?? 0 ) );
			if ( $gunluk <= 1 && is_array( $ek['ortak'] ?? null ) ) {
				$gunluk = max( 1, (int) ( $ek['ortak']['gunluk_adet'] ?? 1 ) );
			}
			$arasi_dk = max( 0, (int) ( $ek['paylasim_arasi_dakika'] ?? 0 ) );
			if ( ! empty( $ek['baslangic_ts'] ) ) {
				$bas_ts = (int) $ek['baslangic_ts'];
				if ( $gunluk > 1 && function_exists( 'tilfy_zamanlama_slot_ts' ) && function_exists( 'tilfy_zamanlama_ts_to_input' ) ) {
					$slot_ts = tilfy_zamanlama_slot_ts( tilfy_zamanlama_ts_to_input( $bas_ts ), $dalga, $gunluk, $arasi_dk );
					if ( $slot_ts > 0 ) {
						$ortak['takvim_gun'] = wp_date( 'Y-m-d H:i:s', $slot_ts );
					}
				} else {
					$slot_ts = $bas_ts + ( (int) $dalga * $arasi_dk * 60 );
					$ortak['takvim_gun'] = wp_date( 'Y-m-d H:i:s', $slot_ts );
				}
			}
		} else {
			unset( $ortak['zamanlama'] );
		}
	} else {
		$hedefler      = tilfy_otomasyon_hedefleri_coz( $kural );
		$kaynak        = sanitize_key( (string) $kural->kaynak_platform );
		$platform_ayar = tilfy_otomasyon_platform_ayar_coz( $kural );
		$ortak         = array( 'kaynak' => 'otomasyon' );
		$zorla         = false;
		$arka_plan     = true;
	}
	$sonuc = tilfy_otomasyon_capraz_yurut( $icerik_id, $hedefler, $ortak, $kaynak, $platform_ayar, $zorla );
	$ids = array_map( 'intval', (array) ( $sonuc['paylasim_ids'] ?? array() ) );
	if ( $oid > 0 && ! empty( $ids ) ) {
		tilfy_otomasyon_kayit_ekle( (int) $kural->id, $icerik_id, $ids, 'baslatildi' );
	}
	return $ids;
}

function tilfy_otomasyon_kural_lock_al( $otomasyon_id ) {
	global $wpdb;
	$otomasyon_id = (int) $otomasyon_id;
	if ( $otomasyon_id <= 0 ) {
		return false;
	}
	return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT GET_LOCK(%s, 5)', 'tilfy_kural_' . $otomasyon_id ) ) === 1;
}

function tilfy_otomasyon_kural_lock_birak( $otomasyon_id ) {
	global $wpdb;
	$otomasyon_id = (int) $otomasyon_id;
	if ( $otomasyon_id <= 0 ) {
		return;
	}
	$wpdb->query( $wpdb->prepare( 'SELECT RELEASE_LOCK(%s)', 'tilfy_kural_' . $otomasyon_id ) );
}

function tilfy_otomasyon_batch_lock_al( $batch_id ) {
	global $wpdb;
	$batch_id = (int) $batch_id;
	if ( $batch_id <= 0 ) {
		return false;
	}
	$key = 'tilfy_batch_' . $batch_id;
	return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT GET_LOCK(%s, 5)', $key ) ) === 1;
}

function tilfy_otomasyon_batch_lock_birak( $batch_id ) {
	global $wpdb;
	$batch_id = (int) $batch_id;
	if ( $batch_id <= 0 ) {
		return;
	}
	$key = 'tilfy_batch_' . $batch_id;
	$wpdb->query( $wpdb->prepare( 'SELECT RELEASE_LOCK(%s)', $key ) );
}

function tilfy_otomasyon_batch_sirali_ilerlet( $batch ) {
	if ( ! $batch ) {
		return array( 'ok' => false, 'adet' => 0 );
	}
	$durum = sanitize_key( (string) ( $batch->durum ?? '' ) );
	if ( ! in_array( $durum, array( 'bekliyor', 'planlandi' ), true ) ) {
		return array( 'ok' => true, 'adet' => 0 );
	}
	$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
	if ( ( $ek['mod'] ?? '' ) === 'paylasim_sirali' && function_exists( 'tilfy_takvim_batch_sirali_ilerlet' ) ) {
		return tilfy_takvim_batch_sirali_ilerlet( $batch );
	}
	$batch_id = (int) $batch->id;
	static $ilerlet_derinlik = 0;
	$kilidi_ben_aldim        = false;
	if ( $ilerlet_derinlik === 0 ) {
		if ( ! tilfy_otomasyon_batch_lock_al( $batch_id ) ) {
			if ( function_exists( 'tilfy_islem_log' ) ) {
				tilfy_islem_log(
					'kuyruk',
					'Batch kilidi alinamadi #' . $batch_id,
					array( 'batch_id' => $batch_id )
				);
			}
			return array( 'ok' => false, 'adet' => 0, 'mesaj' => 'Batch kilidi alinamadi' );
		}
		$kilidi_ben_aldim = true;
	}
	++$ilerlet_derinlik;
	try {
		return tilfy_otomasyon_batch_sirali_ilerlet_ic( tilfy_otomasyon_batch_al( $batch_id ) );
	} finally {
		--$ilerlet_derinlik;
		if ( $kilidi_ben_aldim ) {
			tilfy_otomasyon_batch_lock_birak( $batch_id );
		}
	}
}

function tilfy_otomasyon_batch_sirali_ilerlet_ic( $batch ) {
	global $wpdb;
	if ( ! $batch ) {
		return array( 'ok' => false, 'adet' => 0 );
	}
	$durum = sanitize_key( (string) ( $batch->durum ?? '' ) );
	if ( ! in_array( $durum, array( 'bekliyor', 'planlandi' ), true ) ) {
		return array( 'ok' => true, 'adet' => 0 );
	}
	$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
	if ( ( $ek['mod'] ?? '' ) === 'paylasim_sirali' && function_exists( 'tilfy_takvim_batch_sirali_ilerlet' ) ) {
		return tilfy_takvim_batch_sirali_ilerlet( $batch );
	}
	$kural = tilfy_otomasyon_batch_kural_coz( $batch );
	if ( ! $kural && (int) ( $batch->otomasyon_id ?? 0 ) > 0 ) {
		return array( 'ok' => false, 'adet' => 0 );
	}
	if ( (int) ( $batch->otomasyon_id ?? 0 ) > 0 && ! tilfy_otomasyon_premiere_aktif_mi( $kural ) ) {
		return array( 'ok' => false, 'adet' => 0 );
	}
	$icerik_ids = tilfy_otomasyon_batch_icerik_ids_coz( $batch );
	if ( empty( $icerik_ids ) ) {
		tilfy_otomasyon_batch_durum_guncelle( (int) $batch->id, 'tamamlandi' );
		return array( 'ok' => true, 'adet' => 0 );
	}
	$arasi_sn   = tilfy_otomasyon_arasi_dakika( $kural ) * 60;
	$simdi_ts   = (int) current_time( 'timestamp' );
	$baslatilan = (int) ( $batch->baslatilan_sira ?? 0 );
	$toplam     = count( $icerik_ids );
	$batch_id   = (int) $batch->id;
	if ( $durum === 'bekliyor' ) {
		tilfy_otomasyon_batch_durum_guncelle( $batch_id, 'planlandi' );
		$batch = tilfy_otomasyon_batch_al( $batch_id );
	}
	if ( tilfy_otomasyon_batch_son_dalga_bekliyor_mu( $batch ) ) {
		return array( 'ok' => true, 'adet' => 0 );
	}
	$bekleme_ham = trim( (string) ( $batch->bekleme_bitis ?? '' ) );
	if ( $bekleme_ham !== '' ) {
		$bekleme_ts = function_exists( 'tilfy_yerel_mysql_ts' ) ? tilfy_yerel_mysql_ts( $bekleme_ham ) : strtotime( $bekleme_ham );
		if ( $bekleme_ts > $simdi_ts ) {
			return array( 'ok' => true, 'adet' => 0 );
		}
		tilfy_otomasyon_batch_durum_guncelle( $batch_id, 'planlandi', null, array( 'bekleme_bitis' => null ) );
		$batch       = tilfy_otomasyon_batch_al( $batch_id );
		$bekleme_ham = '';
	}
	if ( $baslatilan > 0 && $baslatilan < $toplam && $bekleme_ham === '' ) {
		$dalga = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
		if ( ! empty( $dalga ) ) {
			$bitis_ts    = tilfy_otomasyon_batch_dalga_bitis_ts( $dalga );
			$sonraki_ts  = $bitis_ts + max( 0, $arasi_sn );
			$bekleme_sql = wp_date( 'Y-m-d H:i:s', $sonraki_ts );
			tilfy_otomasyon_batch_durum_guncelle(
				$batch_id,
				'planlandi',
				null,
				array( 'bekleme_bitis' => $bekleme_sql )
			);
			return array( 'ok' => true, 'adet' => 0 );
		}
	}
	if ( $baslatilan === 0 && (int) ( $batch->otomasyon_id ?? 0 ) > 0 ) {
		$anchor = tilfy_otomasyon_batch_anchor_ts( $kural, $batch );
		if ( $simdi_ts < $anchor ) {
			tilfy_otomasyon_batch_durum_guncelle(
				$batch_id,
				'planlandi',
				null,
				array( 'bekleme_bitis' => wp_date( 'Y-m-d H:i:s', $anchor ) )
			);
			return array( 'ok' => true, 'adet' => 0 );
		}
	}
	$sira_index = $baslatilan;
	if ( $baslatilan >= $toplam ) {
		if ( ! tilfy_otomasyon_batch_devam_ediyor_mu( $batch ) ) {
			tilfy_otomasyon_batch_durum_guncelle( $batch_id, 'tamamlandi' );
		}
		return array( 'ok' => true, 'adet' => 0 );
	}
	if ( $baslatilan === 0 && ( $ek['mod'] ?? '' ) === 'capraz' && $toplam > 1 ) {
		$cid     = (int) $icerik_ids[0];
		$row_ids = tilfy_otomasyon_batch_icerik_baslat( $batch, $kural, $cid, 0 );
		if ( empty( $row_ids ) ) {
			if ( function_exists( 'tilfy_islem_log' ) ) {
				tilfy_islem_log(
					'otomasyon',
					'Batch #' . $batch_id . ' capraz dalga-1 atlandi (icerik #' . $cid . ')',
					array( 'batch_id' => $batch_id, 'icerik_id' => $cid )
				);
			}
			if ( (int) ( $batch->otomasyon_id ?? 0 ) > 0 && $kural ) {
				tilfy_otomasyon_kayit_ekle( (int) $kural->id, $cid, array(), 'atlandi' );
			}
			$mevcut = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
			tilfy_otomasyon_batch_durum_guncelle(
				$batch_id,
				'planlandi',
				$mevcut,
				array(
					'baslatilan_sira'        => 1,
					'son_dalga_paylasim_ids' => array(),
					'bekleme_bitis'          => null,
				)
			);
			return tilfy_otomasyon_batch_sirali_ilerlet( tilfy_otomasyon_batch_al( $batch_id ) );
		}
		tilfy_otomasyon_batch_durum_guncelle(
			$batch_id,
			'planlandi',
			$row_ids,
			array(
				'baslatilan_sira'        => 1,
				'son_dalga_paylasim_ids' => $row_ids,
				'bekleme_bitis'          => null,
			)
		);
		if ( function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
			tilfy_kuyruk_arka_plan_tetik();
		}
		return array(
			'ok'           => true,
			'adet'         => count( $row_ids ),
			'paylasim_ids' => $row_ids,
		);
	}
	$icerik_id = (int) $icerik_ids[ $sira_index ];
	$sirada_ids = tilfy_otomasyon_batch_icerik_sirada_paylasim_ids( $batch, $icerik_id );
	if ( ! empty( $sirada_ids ) ) {
		$yeni_ids = tilfy_otomasyon_batch_sirada_aktif_et( $sirada_ids, $batch );
	} else {
		$yeni_ids = tilfy_otomasyon_batch_icerik_baslat( $batch, $kural, $icerik_id );
	}
	$otomasyon_oid = (int) ( $batch->otomasyon_id ?? 0 );
	if ( empty( $yeni_ids ) ) {
		if ( $otomasyon_oid > 0 ) {
			tilfy_otomasyon_kayit_ekle( (int) $kural->id, $icerik_id, array(), 'atlandi' );
		}
		$mevcut = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
		tilfy_otomasyon_batch_durum_guncelle(
			$batch_id,
			'planlandi',
			$mevcut,
			array(
				'baslatilan_sira'        => $baslatilan + 1,
				'son_dalga_paylasim_ids' => array(),
				'bekleme_bitis'          => null,
			)
		);
		return tilfy_otomasyon_batch_sirali_ilerlet( tilfy_otomasyon_batch_al( $batch_id ) );
	}
	$mevcut = array_merge( tilfy_otomasyon_batch_paylasim_ids_coz( $batch ), $yeni_ids );
	tilfy_otomasyon_batch_durum_guncelle(
		$batch_id,
		'planlandi',
		$mevcut,
		array(
			'baslatilan_sira'        => $baslatilan + 1,
			'son_dalga_paylasim_ids' => $yeni_ids,
			'bekleme_bitis'          => null,
		)
	);
	if ( function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
		tilfy_kuyruk_arka_plan_tetik();
	}
	return array(
		'ok'           => true,
		'adet'         => count( $yeni_ids ),
		'paylasim_ids' => $yeni_ids,
	);
}

function tilfy_otomasyon_batch_stale_yukleniyor_temizle() {
	global $wpdb;
	$batch_t    = tilfy_tablo( 'otomasyon_batch' );
	$paylasim_t = tilfy_tablo( 'paylasim' );
	$satirlar   = $wpdb->get_results(
		"SELECT * FROM {$batch_t} WHERE durum IN ('planlandi','bekliyor')"
	);
	$simdi = current_time( 'mysql' );
	$esik  = wp_date( 'Y-m-d H:i:s', (int) current_time( 'timestamp' ) - 45 * 60 );
	foreach ( (array) $satirlar as $batch ) {
		$pids = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
		if ( empty( $pids ) ) {
			continue;
		}
		$in = tilfy_sql_in_ints( $pids );
		if ( ! $in ) {
			continue;
		}
		$stale = $wpdb->get_col(
			$wpdb->prepare(
				"SELECT id FROM {$paylasim_t} WHERE id IN ({$in['yer']}) AND durum = 'yukleniyor' AND guncelleme < %s",
				array_merge( $in['degerler'], array( $esik ) )
			)
		);
		foreach ( (array) $stale as $pid ) {
			$wpdb->update(
				$paylasim_t,
				array(
					'durum'       => 'hata',
					'hata_mesaji' => 'Yukleme zaman asimi (45 dk)',
					'guncelleme'  => $simdi,
				),
				array( 'id' => (int) $pid )
			);
		}
	}
}

function tilfy_otomasyon_batch_sirali_tum_kontrol() {
	global $wpdb;
	tilfy_otomasyon_batch_stale_yukleniyor_temizle();
	$t = tilfy_tablo( 'otomasyon_batch' );
	$liste = $wpdb->get_results(
		"SELECT * FROM {$t} WHERE durum IN ('planlandi','bekliyor') ORDER BY id ASC"
	);
	foreach ( (array) $liste as $batch ) {
		tilfy_otomasyon_batch_sirali_ilerlet( $batch );
	}
}

function tilfy_otomasyon_batch_planla( $kural, $batch_id ) {
	$batch = tilfy_otomasyon_batch_al( $batch_id );
	if ( ! $batch ) {
		return array( 'ok' => false, 'mesaj' => 'Batch bulunamadi' );
	}
	$kural_coz = $kural ? $kural : tilfy_otomasyon_batch_kural_coz( $batch );
	$oid       = (int) ( $batch->otomasyon_id ?? 0 );
	if ( $oid > 0 ) {
		if ( ! $kural_coz || ! tilfy_otomasyon_premiere_aktif_mi( $kural_coz ) ) {
			return array( 'ok' => false, 'mesaj' => 'Batch bulunamadi' );
		}
	}
	$sonuc = tilfy_otomasyon_batch_sirali_ilerlet( $batch );
	$batch = tilfy_otomasyon_batch_al( $batch_id );
	$ids   = $batch ? tilfy_otomasyon_batch_paylasim_ids_coz( $batch ) : array();
	$adet  = (int) ( $sonuc['adet'] ?? 0 );
	if ( $adet <= 0 && ! empty( $ids ) ) {
		$adet = count( $ids );
	}
	return array(
		'ok'           => true,
		'mesaj'        => $adet > 0 ? 'Sirali batch baslatildi' : 'Sirali batch bekliyor',
		'adet'         => $adet,
		'paylasim_ids' => $ids,
		'zamanlandi'   => false,
	);
}

function tilfy_otomasyon_batch_sonraki_kontrol( $kural ) {
	global $wpdb;
	$oid = (int) $kural->id;
	tilfy_otomasyon_batch_sirali_tum_kontrol();
	$planlar = $wpdb->get_results(
		$wpdb->prepare(
			'SELECT * FROM ' . tilfy_tablo( 'otomasyon_batch' ) . " WHERE otomasyon_id = %d AND durum = 'planlandi' ORDER BY id ASC",
			$oid
		)
	);
	foreach ( (array) $planlar as $batch ) {
		if ( ! tilfy_otomasyon_batch_devam_ediyor_mu( $batch ) ) {
			tilfy_otomasyon_batch_durum_guncelle( (int) $batch->id, 'tamamlandi' );
		}
	}
	$bekleyen = $wpdb->get_row(
		$wpdb->prepare(
			'SELECT * FROM ' . tilfy_tablo( 'otomasyon_batch' ) . " WHERE otomasyon_id = %d AND durum = 'bekliyor' ORDER BY id ASC LIMIT 1",
			$oid
		)
	);
	if ( $bekleyen && ! tilfy_otomasyon_batch_aktif_var( $oid ) ) {
		return tilfy_otomasyon_batch_planla( $kural, (int) $bekleyen->id );
	}
	return array( 'ok' => true, 'mesaj' => 'Batch kontrol', 'adet' => 0 );
}

function tilfy_otomasyon_batch_icerik_temizle( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return;
	}
	$batch_t = tilfy_tablo( 'otomasyon_batch' );
	if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $batch_t ) ) !== $batch_t ) {
		return;
	}
	$satirlar = $wpdb->get_results(
		"SELECT * FROM {$batch_t} WHERE durum IN ('bekliyor','planlandi')"
	);
	foreach ( (array) $satirlar as $batch ) {
		$ek = tilfy_otomasyon_batch_ek_veri_coz( $batch );
		if ( ( $ek['mod'] ?? '' ) === 'paylasim_sirali' ) {
			continue;
		}
		$ids = tilfy_otomasyon_batch_icerik_ids_coz( $batch );
		if ( ! in_array( $icerik_id, $ids, true ) ) {
			continue;
		}
		$ids = array_values( array_diff( $ids, array( $icerik_id ) ) );
		if ( empty( $ids ) ) {
			$wpdb->delete( $batch_t, array( 'id' => (int) $batch->id ) );
			continue;
		}
		$wpdb->update(
			$batch_t,
			array(
				'icerik_ids' => wp_json_encode( $ids ),
				'guncelleme' => current_time( 'mysql' ),
			),
			array( 'id' => (int) $batch->id )
		);
	}
}

function tilfy_otomasyon_batch_baslatilan_sira_hesapla( $batch, $pids = null ) {
	$icerik_ids = tilfy_otomasyon_batch_icerik_ids_coz( $batch );
	if ( empty( $icerik_ids ) ) {
		return 0;
	}
	if ( $pids === null ) {
		$pids = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
	}
	$pids = array_values( array_filter( array_map( 'intval', (array) $pids ) ) );
	$in   = tilfy_sql_in_ints( $pids );
	if ( ! $in ) {
		return 0;
	}
	global $wpdb;
	$baslat = 0;
	foreach ( $icerik_ids as $cid ) {
		$cnt = (int) $wpdb->get_var(
			$wpdb->prepare(
				'SELECT COUNT(*) FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE id IN ({$in['yer']}) AND icerik_id = %d",
				array_merge( $in['degerler'], array( (int) $cid ) )
			)
		);
		if ( $cnt <= 0 ) {
			break;
		}
		++$baslat;
	}
	return $baslat;
}

function tilfy_otomasyon_batch_paylasim_silindi( $paylasim_id ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return;
	}
	if ( function_exists( 'tilfy_otomasyon_batch_paylasim_kuyruktan_cikar' ) ) {
		tilfy_otomasyon_batch_paylasim_kuyruktan_cikar( $paylasim_id, true );
	}
	$batch_t = tilfy_tablo( 'otomasyon_batch' );
	if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $batch_t ) ) !== $batch_t ) {
		return;
	}
	$satirlar = $wpdb->get_results(
		"SELECT * FROM {$batch_t} WHERE durum IN ('bekliyor','planlandi')"
	);
	foreach ( (array) $satirlar as $batch ) {
		$pids    = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
		$dalga   = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
		$p_degisti = in_array( $paylasim_id, $pids, true );
		$d_degisti = in_array( $paylasim_id, $dalga, true );
		if ( ! $p_degisti && ! $d_degisti ) {
			continue;
		}
		$batch_id = (int) $batch->id;
		if ( ! tilfy_otomasyon_batch_lock_al( $batch_id ) ) {
			continue;
		}
		try {
			$batch = tilfy_otomasyon_batch_al( $batch_id );
			if ( ! $batch ) {
				continue;
			}
			$pids  = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
			$dalga = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
			$p_degisti = in_array( $paylasim_id, $pids, true );
			$d_degisti = in_array( $paylasim_id, $dalga, true );
			if ( ! $p_degisti && ! $d_degisti ) {
				continue;
			}
			$ekstra = array();
			if ( $d_degisti ) {
				$dalga = array_values( array_diff( $dalga, array( $paylasim_id ) ) );
				$ekstra['son_dalga_paylasim_ids'] = $dalga;
			}
			if ( $p_degisti ) {
				$pids = array_values( array_diff( $pids, array( $paylasim_id ) ) );
				$ekstra['baslatilan_sira'] = tilfy_otomasyon_batch_baslatilan_sira_hesapla( $batch, $pids );
			}
			tilfy_otomasyon_batch_durum_guncelle(
				$batch_id,
				sanitize_key( (string) ( $batch->durum ?? 'planlandi' ) ),
				$p_degisti ? $pids : null,
				$ekstra
			);
			$guncel = tilfy_otomasyon_batch_al( $batch_id );
			if ( $guncel && in_array( sanitize_key( (string) ( $guncel->durum ?? '' ) ), array( 'bekliyor', 'planlandi' ), true ) ) {
				tilfy_otomasyon_batch_sirali_ilerlet( $guncel );
			}
		} finally {
			tilfy_otomasyon_batch_lock_birak( $batch_id );
		}
	}
}

function tilfy_otomasyon_batch_paylasim_kuyruktan_cikar( $paylasim_id, $ilerlet = true ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return;
	}
	$batch_t = tilfy_tablo( 'otomasyon_batch' );
	if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $batch_t ) ) !== $batch_t ) {
		return;
	}
	$satirlar = $wpdb->get_results(
		"SELECT * FROM {$batch_t} WHERE durum IN ('bekliyor','planlandi')"
	);
	foreach ( (array) $satirlar as $batch ) {
		$kuyruk = tilfy_otomasyon_batch_icerik_ids_coz( $batch );
		if ( ! in_array( $paylasim_id, $kuyruk, true ) ) {
			continue;
		}
		$batch_id = (int) $batch->id;
		if ( ! tilfy_otomasyon_batch_lock_al( $batch_id ) ) {
			continue;
		}
		try {
			$batch = tilfy_otomasyon_batch_al( $batch_id );
			if ( ! $batch ) {
				continue;
			}
			$kuyruk = tilfy_otomasyon_batch_icerik_ids_coz( $batch );
			if ( ! in_array( $paylasim_id, $kuyruk, true ) ) {
				continue;
			}
			$kuyruk = array_values( array_diff( $kuyruk, array( $paylasim_id ) ) );
			$wpdb->update(
				$batch_t,
				array(
					'icerik_ids' => wp_json_encode( $kuyruk ),
					'guncelleme' => current_time( 'mysql' ),
				),
				array( 'id' => $batch_id )
			);
			if ( empty( $kuyruk ) && function_exists( 'tilfy_otomasyon_batch_durum_guncelle' ) ) {
				$dalga = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
				if ( empty( $dalga ) || ! tilfy_otomasyon_batch_paylasim_ids_bekliyor_mu( $dalga ) ) {
					tilfy_otomasyon_batch_durum_guncelle( $batch_id, 'tamamlandi' );
				}
			}
			if ( $ilerlet ) {
				$guncel = tilfy_otomasyon_batch_al( $batch_id );
				if ( $guncel && in_array( sanitize_key( (string) ( $guncel->durum ?? '' ) ), array( 'bekliyor', 'planlandi' ), true ) ) {
					tilfy_otomasyon_batch_sirali_ilerlet( $guncel );
				}
			}
		} finally {
			tilfy_otomasyon_batch_lock_birak( $batch_id );
		}
	}
}

function tilfy_otomasyon_batch_paylasim_simdi_gonder_bagla( $paylasim_id, $batch ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	$batch_id    = (int) ( $batch->id ?? 0 );
	if ( $paylasim_id <= 0 || $batch_id <= 0 ) {
		return false;
	}
	if ( ! tilfy_otomasyon_batch_lock_al( $batch_id ) ) {
		return false;
	}
	try {
		$batch = tilfy_otomasyon_batch_al( $batch_id );
		if ( ! $batch ) {
			return false;
		}
		$kuyruk = array_values( array_diff( tilfy_otomasyon_batch_icerik_ids_coz( $batch ), array( $paylasim_id ) ) );
		$wpdb->update(
			tilfy_tablo( 'otomasyon_batch' ),
			array(
				'icerik_ids' => wp_json_encode( $kuyruk ),
				'guncelleme' => current_time( 'mysql' ),
			),
			array( 'id' => $batch_id )
		);
		$tum = array_values( array_unique( array_merge( tilfy_otomasyon_batch_paylasim_ids_coz( $batch ), array( $paylasim_id ) ) ) );
		tilfy_otomasyon_batch_durum_guncelle(
			$batch_id,
			'planlandi',
			$tum,
			array(
				'baslatilan_sira'        => (int) ( $batch->baslatilan_sira ?? 0 ) + 1,
				'son_dalga_paylasim_ids' => array( $paylasim_id ),
				'bekleme_bitis'          => null,
			)
		);
		return true;
	} finally {
		tilfy_otomasyon_batch_lock_birak( $batch_id );
	}
}

function tilfy_otomasyon_batch_paylasim_siradan_ayrildi( $paylasim_id ) {
	tilfy_otomasyon_batch_paylasim_kuyruktan_cikar( $paylasim_id, true );
	tilfy_otomasyon_batch_paylasim_dalgadan_ayir( $paylasim_id, true );
}

function tilfy_otomasyon_batch_paylasim_dalgadan_ayir( $paylasim_id, $ilerlet = true ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return;
	}
	$batch_t = tilfy_tablo( 'otomasyon_batch' );
	if ( $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $batch_t ) ) !== $batch_t ) {
		return;
	}
	$satirlar = $wpdb->get_results(
		"SELECT * FROM {$batch_t} WHERE durum IN ('bekliyor','planlandi')"
	);
	foreach ( (array) $satirlar as $batch ) {
		$pids    = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
		$dalga   = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
		$p_degisti = in_array( $paylasim_id, $pids, true );
		$d_degisti = in_array( $paylasim_id, $dalga, true );
		if ( ! $p_degisti && ! $d_degisti ) {
			continue;
		}
		$batch_id = (int) $batch->id;
		if ( ! tilfy_otomasyon_batch_lock_al( $batch_id ) ) {
			continue;
		}
		try {
			$batch = tilfy_otomasyon_batch_al( $batch_id );
			if ( ! $batch ) {
				continue;
			}
			$pids  = tilfy_otomasyon_batch_paylasim_ids_coz( $batch );
			$dalga = tilfy_otomasyon_batch_son_dalga_ids_coz( $batch );
			$p_degisti = in_array( $paylasim_id, $pids, true );
			$d_degisti = in_array( $paylasim_id, $dalga, true );
			if ( ! $p_degisti && ! $d_degisti ) {
				continue;
			}
			$ekstra = array();
			if ( $d_degisti ) {
				$dalga = array_values( array_diff( $dalga, array( $paylasim_id ) ) );
				$ekstra['son_dalga_paylasim_ids'] = $dalga;
			}
			if ( $p_degisti ) {
				$pids = array_values( array_diff( $pids, array( $paylasim_id ) ) );
				$ekstra['baslatilan_sira'] = tilfy_otomasyon_batch_baslatilan_sira_hesapla( $batch, $pids );
			}
			tilfy_otomasyon_batch_durum_guncelle(
				$batch_id,
				sanitize_key( (string) ( $batch->durum ?? 'planlandi' ) ),
				$p_degisti ? $pids : null,
				$ekstra
			);
			if ( $ilerlet ) {
				$guncel = tilfy_otomasyon_batch_al( $batch_id );
				if ( $guncel && in_array( sanitize_key( (string) ( $guncel->durum ?? '' ) ), array( 'bekliyor', 'planlandi' ), true ) ) {
					tilfy_otomasyon_batch_sirali_ilerlet( $guncel );
				}
			}
		} finally {
			tilfy_otomasyon_batch_lock_birak( $batch_id );
		}
	}
}

function tilfy_otomasyon_gecikme_saat( $kural ) {
	return max( 0, (float) ( $kural->gecikme_saat ?? 0 ) );
}

function tilfy_otomasyon_icerik_tarihi_ts( $icerik ) {
	$kaynak = trim( (string) ( $icerik->kaynak_tarihi ?? '' ) );
	if ( $kaynak !== '' ) {
		$ts = strtotime( $kaynak . ' UTC' );
		return $ts ? (int) $ts : null;
	}
	$olusturulma = trim( (string) ( $icerik->olusturulma ?? '' ) );
	if ( $olusturulma === '' ) {
		return null;
	}
	if ( function_exists( 'tilfy_yerel_mysql_ts' ) ) {
		$ts = tilfy_yerel_mysql_ts( $olusturulma );
		return $ts > 0 ? $ts : null;
	}
	$ts = strtotime( $olusturulma );
	return $ts ? (int) $ts : null;
}

function tilfy_otomasyon_gecikme_dolmus_mu( $kural, $icerik ) {
	$gecikme = tilfy_otomasyon_gecikme_saat( $kural );
	if ( $gecikme <= 0 ) {
		return true;
	}
	$tarih_ts = tilfy_otomasyon_icerik_tarihi_ts( $icerik );
	if ( $tarih_ts === null ) {
		return false;
	}
	return $tarih_ts <= ( (int) current_time( 'timestamp' ) - (int) round( $gecikme * 3600 ) );
}

function tilfy_otomasyon_gecikme_esigi( $kural ) {
	$gecikme = tilfy_otomasyon_gecikme_saat( $kural );
	if ( $gecikme <= 0 ) {
		return null;
	}
	return wp_date( 'Y-m-d H:i:s', (int) current_time( 'timestamp' ) - (int) round( $gecikme * 3600 ) );
}

function tilfy_otomasyon_son_islenen_icerik_id( $kural ) {
	global $wpdb;
	if ( ! $kural ) {
		return 0;
	}
	return (int) $wpdb->get_var(
		$wpdb->prepare(
			'SELECT MAX(icerik_id) FROM ' . tilfy_tablo( 'otomasyon_kayit' ) . ' WHERE otomasyon_id = %d',
			(int) $kural->id
		)
	);
}

function tilfy_otomasyon_medya_format_uygun_mu( $format, $icerik ) {
	$format = sanitize_key( (string) $format );
	$tip    = strtolower( (string) ( $icerik->medya_tipi ?? '' ) );
	$gorsel = array( 'image', 'photo', 'carousel_album', 'gorsel', 'thumbnail', 'album' );
	if ( $format === 'gorsel' ) {
		return in_array( $tip, $gorsel, true );
	}
	if ( $format === 'video' ) {
		return ! in_array( $tip, $gorsel, true );
	}
	return true;
}

function tilfy_otomasyon_icerik_hedefte_var_mi( $icerik_id, $hedefler ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 || empty( $hedefler ) ) {
		return false;
	}
	$hedefler = array_values( array_filter( array_map( 'sanitize_key', (array) $hedefler ) ) );
	if ( empty( $hedefler ) ) {
		return false;
	}
	$durumlar = array( 'beklemede', 'yukleniyor', 'zamanlandi', 'sirada', 'yuklendi', 'manuel_bekliyor', 'hata' );
	$h_yer    = implode( ',', array_fill( 0, count( $hedefler ), '%s' ) );
	$d_yer    = implode( ',', array_fill( 0, count( $durumlar ), '%s' ) );
	$pt       = tilfy_tablo( 'paylasim' );
	$bulundu  = $wpdb->get_var(
		$wpdb->prepare(
			"SELECT COUNT(*) FROM {$pt} p
			WHERE p.icerik_id = %d
			AND p.hedef_platform IN ({$h_yer})
			AND p.durum IN ({$d_yer})",
			...array_merge( array( $icerik_id ), $hedefler, $durumlar )
		)
	);
	return (int) $bulundu > 0;
}

function tilfy_otomasyon_icerik_kuralda_mi( $otomasyon_id, $icerik_id ) {
	global $wpdb;
	return (int) $wpdb->get_var(
		$wpdb->prepare(
			'SELECT COUNT(*) FROM ' . tilfy_tablo( 'otomasyon_kayit' ) . ' WHERE otomasyon_id = %d AND icerik_id = %d',
			(int) $otomasyon_id,
			(int) $icerik_id
		)
	) > 0;
}

function tilfy_otomasyon_icerik_durum( $kural, $icerik ) {
	if ( ! $kural || ! $icerik ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Geçersiz kayıt' ),
		);
	}
	if ( sanitize_key( (string) ( $icerik->durum ?? '' ) ) === 'gizli' ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'İçerik gizli' ),
		);
	}
	if ( sanitize_key( (string) $icerik->kaynak_platform ) !== sanitize_key( (string) $kural->kaynak_platform ) ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Kaynak platform uyuşmuyor' ),
		);
	}
	if ( ! tilfy_otomasyon_medya_format_uygun_mu( (string) ( $kural->medya_format ?? 'tumu' ), $icerik ) ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'İçerik tipi filtresine uymuyor' ),
		);
	}
	if ( ! tilfy_otomasyon_icerik_baslangic_uygun_mu( $kural, $icerik ) ) {
		$min = tilfy_otomasyon_baslangic_tarihi( $kural );
		return array(
			'uygun' => false,
			'neden' => $min ? sprintf( tilfy__( 'Kaynak tarihi %s öncesi' ), mysql2date( 'd.m.Y', $min ) ) : tilfy__( 'Kaynak tarihi uygun değil' ),
		);
	}
	$gecikme = tilfy_otomasyon_gecikme_saat( $kural );
	if ( $gecikme > 0 && ! tilfy_otomasyon_premiere_aktif_mi( $kural ) ) {
		$tarih = tilfy_otomasyon_icerik_tarihi( $icerik );
		if ( $tarih === '' ) {
			return array(
				'uygun' => false,
				'neden' => tilfy__( 'Tarih bilgisi yok' ),
			);
		}
		if ( ! tilfy_otomasyon_gecikme_dolmus_mu( $kural, $icerik ) ) {
			return array(
				'uygun' => false,
				'neden' => tilfy__( 'Gecikme süresi dolmadı' ),
			);
		}
	}
	$son_icerik_id = tilfy_otomasyon_son_islenen_icerik_id( $kural );
	if ( $son_icerik_id > 0 && (int) $icerik->id <= $son_icerik_id ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Bu kuralda daha önce işlendi' ),
		);
	}
	if ( tilfy_otomasyon_icerik_kuralda_mi( (int) $kural->id, (int) $icerik->id ) ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Bu kuralda kayıtlı' ),
		);
	}
	if ( tilfy_otomasyon_icerik_rezerve_mi( (int) $icerik->id, (int) $kural->id ) ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Baska kural veya batch rezerve' ),
		);
	}
	$hedefler = tilfy_otomasyon_hedefleri_coz( $kural );
	if ( tilfy_otomasyon_icerik_hedefte_var_mi( (int) $icerik->id, $hedefler ) ) {
		return array(
			'uygun' => false,
			'neden' => tilfy__( 'Hedefte zaten paylaşım var' ),
		);
	}
	return array(
		'uygun' => true,
		'neden' => tilfy__( 'Seçilebilir' ),
	);
}

function tilfy_otomasyon_paylasilmamis_listele( $kural, $limit = 15 ) {
	global $wpdb;
	if ( ! $kural ) {
		return array();
	}
	$limit   = max( 1, min( 30, (int) $limit ) );
	$kaynak  = sanitize_key( (string) $kural->kaynak_platform );
	$hedefler = tilfy_otomasyon_hedefleri_coz( $kural );
	$pt      = tilfy_tablo( 'paylasim' );
	$paylasim_filtre = '';
	$bind_extra      = array();
	if ( ! empty( $hedefler ) ) {
		$durumlar = array( 'beklemede', 'yukleniyor', 'zamanlandi', 'sirada', 'yuklendi', 'manuel_bekliyor', 'hata' );
		$h_yer    = implode( ',', array_fill( 0, count( $hedefler ), '%s' ) );
		$d_yer    = implode( ',', array_fill( 0, count( $durumlar ), '%s' ) );
		$paylasim_filtre = " AND NOT EXISTS (
			SELECT 1 FROM {$pt} p
			WHERE p.icerik_id = i.id
			AND p.hedef_platform IN ({$h_yer})
			AND p.durum IN ({$d_yer})
		)";
		$bind_extra = array_merge( $hedefler, $durumlar );
	}
	$sql = 'SELECT i.* FROM ' . tilfy_tablo( 'icerik' ) . " i
		WHERE i.kaynak_platform = %s
		AND i.durum <> 'gizli'
		{$paylasim_filtre}
		ORDER BY i.id DESC
		LIMIT %d";
	$satirlar = $wpdb->get_results(
		$wpdb->prepare( $sql, $kaynak, ...array_merge( $bind_extra, array( $limit ) ) )
	);
	$cikti = array();
	foreach ( (array) $satirlar as $icerik ) {
		$durum = tilfy_otomasyon_icerik_durum( $kural, $icerik );
		$cikti[] = array(
			'icerik' => $icerik,
			'uygun'  => ! empty( $durum['uygun'] ),
			'neden'  => (string) ( $durum['neden'] ?? '' ),
		);
	}
	return $cikti;
}

function tilfy_otomasyon_icerik_adaylari( $kural, $limit = null ) {
	global $wpdb;
	if ( ! $kural ) {
		return array();
	}
	if ( $limit === null ) {
		$limit = (int) ( $kural->islem_adedi ?? 1 );
	}
	$limit    = max( 1, min( 20, (int) $limit ) );
	$premiere = tilfy_otomasyon_premiere_aktif_mi( $kural );
	if ( $premiere ) {
		$limit = min( $limit, tilfy_otomasyon_gunluk_adet( $kural ) );
	}
	$gecikme       = tilfy_otomasyon_gecikme_saat( $kural );
	$esik          = $premiere ? null : tilfy_otomasyon_gecikme_esigi( $kural );
	$son_icerik_id = tilfy_otomasyon_son_islenen_icerik_id( $kural );
	$kaynak        = sanitize_key( (string) $kural->kaynak_platform );
	$oid         = (int) $kural->id;
	$hedefler    = tilfy_otomasyon_hedefleri_coz( $kural );
	$medya       = tilfy_otomasyon_medya_format_sql( (string) ( $kural->medya_format ?? 'tumu' ) );
	$kayit_t     = tilfy_tablo( 'otomasyon_kayit' );
	$pt          = tilfy_tablo( 'paylasim' );
	$paylasim_filtre = '';
	$bind_extra      = array();
	if ( ! empty( $hedefler ) ) {
		$durumlar = array( 'beklemede', 'yukleniyor', 'zamanlandi', 'sirada', 'yuklendi', 'manuel_bekliyor', 'hata' );
		$h_yer    = implode( ',', array_fill( 0, count( $hedefler ), '%s' ) );
		$d_yer    = implode( ',', array_fill( 0, count( $durumlar ), '%s' ) );
		$paylasim_filtre = " AND NOT EXISTS (
			SELECT 1 FROM {$pt} p
			WHERE p.icerik_id = i.id
			AND p.hedef_platform IN ({$h_yer})
			AND p.durum IN ({$d_yer})
		)";
		$bind_extra = array_merge( $hedefler, $durumlar );
	}
	$id_filtre = '';
	$bind_id   = array();
	if ( $son_icerik_id > 0 ) {
		$id_filtre = ' AND i.id > %d';
		$bind_id   = array( $son_icerik_id );
	}
	$gecikme_filtre = '';
	$bind_gecikme   = array();
	if ( ! $premiere && $gecikme > 0 && $esik !== null ) {
		$gecikme_filtre = ' AND COALESCE(i.kaynak_tarihi, i.olusturulma) <= %s';
		$bind_gecikme   = array( $esik );
	}
	$baslangic_filtre = '';
	$bind_baslangic   = array();
	$baslangic        = tilfy_otomasyon_baslangic_tarihi( $kural );
	if ( $baslangic !== null ) {
		$baslangic_filtre = ' AND DATE(COALESCE(i.kaynak_tarihi, i.olusturulma)) >= %s';
		$bind_baslangic   = array( $baslangic );
	}
	$sql = 'SELECT i.* FROM ' . tilfy_tablo( 'icerik' ) . " i
		WHERE i.kaynak_platform = %s
		AND i.durum <> 'gizli'
		{$gecikme_filtre}
		{$baslangic_filtre}
		{$id_filtre}
		AND NOT EXISTS (SELECT 1 FROM {$kayit_t} k WHERE k.otomasyon_id = %d AND k.icerik_id = i.id AND k.durum = 'baslatildi')
		{$medya}
		{$paylasim_filtre}
		ORDER BY COALESCE(i.kaynak_tarihi, i.olusturulma) DESC, i.id DESC
		LIMIT %d";
	$adaylar = $wpdb->get_results(
		$wpdb->prepare(
			$sql,
			$kaynak,
			...array_merge( $bind_gecikme, $bind_baslangic, $bind_id, array( $oid ), $bind_extra, array( $limit ) )
		)
	);
	if ( $premiere ) {
		$rezerve = tilfy_otomasyon_rezerve_icerik_ids( (int) $kural->id );
		if ( ! empty( $rezerve ) ) {
			$filtreli = array();
			foreach ( (array) $adaylar as $icerik ) {
				if ( ! in_array( (int) $icerik->id, $rezerve, true ) ) {
					$filtreli[] = $icerik;
				}
			}
			return $filtreli;
		}
		return $adaylar;
	}
	if ( $gecikme > 0 && ! empty( $adaylar ) ) {
		$filtreli = array();
		foreach ( (array) $adaylar as $icerik ) {
			if ( tilfy_otomasyon_gecikme_dolmus_mu( $kural, $icerik ) ) {
				$filtreli[] = $icerik;
			}
		}
		$adaylar = $filtreli;
	}
	$rezerve = tilfy_otomasyon_rezerve_icerik_ids( $oid );
	if ( empty( $rezerve ) ) {
		return $adaylar;
	}
	$filtreli = array();
	foreach ( (array) $adaylar as $icerik ) {
		if ( ! in_array( (int) $icerik->id, $rezerve, true ) ) {
			$filtreli[] = $icerik;
		}
	}
	return $filtreli;
}

function tilfy_otomasyon_kaynak_senkron( $platform ) {
	$platform = sanitize_key( (string) $platform );
	if ( ! in_array( $platform, array( 'instagram', 'facebook', 'youtube', 'threads', 'wordpress' ), true ) ) {
		return array( 'ok' => true, 'mesaj' => 'Senkron gerekmez' );
	}
	if ( $platform === 'wordpress' && ( ! function_exists( 'tilfy_wordpress_kaynak_aktif_mi' ) || ! tilfy_wordpress_kaynak_aktif_mi() ) ) {
		return array( 'ok' => false, 'mesaj' => 'WordPress kaynagi kapali' );
	}
	if ( function_exists( 'tilfy_api_dosyalari_yukle' ) ) {
		tilfy_api_dosyalari_yukle();
	}
	if ( ! function_exists( 'tilfy_icerik_platformdan_cek' ) ) {
		return array( 'ok' => false, 'mesaj' => 'Senkron modulu yok' );
	}
	return tilfy_icerik_platformdan_cek(
		array(
			'platform' => $platform,
			'mod'      => 'yeni',
		)
	);
}

function tilfy_otomasyon_atlandi_temizle( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return;
	}
	$wpdb->delete(
		tilfy_tablo( 'otomasyon_kayit' ),
		array(
			'icerik_id' => $icerik_id,
			'durum'     => 'atlandi',
		)
	);
}

function tilfy_otomasyon_kayit_ekle( $otomasyon_id, $icerik_id, $paylasim_ids, $durum = 'baslatildi' ) {
	global $wpdb;
	$otomasyon_id = (int) $otomasyon_id;
	$icerik_id    = (int) $icerik_id;
	$durum        = sanitize_key( $durum );
	$simdi        = current_time( 'mysql' );
	$wpdb->replace(
		tilfy_tablo( 'otomasyon_kayit' ),
		array(
			'otomasyon_id' => $otomasyon_id,
			'icerik_id'    => $icerik_id,
			'paylasim_ids' => wp_json_encode( array_map( 'intval', (array) $paylasim_ids ) ),
			'durum'        => $durum,
			'olusturulma'  => $simdi,
		),
		array( '%d', '%d', '%s', '%s', '%s' )
	);
	return (int) $wpdb->insert_id;
}

function tilfy_otomasyon_capraz_yurut( $icerik_id, $hedefler, $ortak, $kaynak, $platform_ayar, $zorla = false ) {
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return array( 'adet' => 0, 'paylasim_ids' => array(), 'uyarilar' => array(), 'engellenen' => array() );
	}
	if ( function_exists( 'tilfy_capraz_islem_yurut' ) ) {
		$sonuc = tilfy_capraz_islem_yurut( array( $icerik_id ), $hedefler, $ortak, $kaynak, $platform_ayar, $zorla, false );
		if ( is_wp_error( $sonuc ) ) {
			$data = $sonuc->get_error_data();
			return array(
				'adet'         => 0,
				'paylasim_ids' => array(),
				'uyarilar'     => is_array( $data ) ? (array) ( $data['uyarilar'] ?? array() ) : array(),
				'engellenen'   => is_array( $data ) ? (array) ( $data['engellenen'] ?? array() ) : array(),
			);
		}
		return $sonuc;
	}
	if ( ! function_exists( 'tilfy_capraz_paylasim_baslat' ) ) {
		return array( 'adet' => 0, 'paylasim_ids' => array(), 'uyarilar' => array(), 'engellenen' => array() );
	}
	return tilfy_capraz_paylasim_baslat( array( $icerik_id ), $hedefler, $ortak, $kaynak, $platform_ayar, $zorla, true );
}

function tilfy_otomasyon_kural_isle_anlik( $kural ) {
	$oid = (int) $kural->id;
	if ( ! tilfy_otomasyon_kural_lock_al( $oid ) ) {
		return array( 'ok' => false, 'mesaj' => 'Kural kilidi alinamadi', 'adet' => 0 );
	}
	try {
		return tilfy_otomasyon_kural_isle_anlik_ic( $kural );
	} finally {
		tilfy_otomasyon_kural_lock_birak( $oid );
	}
}

function tilfy_otomasyon_kural_isle_anlik_ic( $kural ) {
	$adaylar = tilfy_otomasyon_icerik_adaylari( $kural );
	if ( empty( $adaylar ) ) {
		return array( 'ok' => true, 'mesaj' => 'Yeni aday yok', 'adet' => 0 );
	}
	if ( ! function_exists( 'tilfy_capraz_paylasim_baslat' ) ) {
		return array( 'ok' => false, 'mesaj' => 'Capraz paylasim modulu yok' );
	}
	$kaynak        = sanitize_key( (string) $kural->kaynak_platform );
	$hedefler      = tilfy_otomasyon_hedefleri_coz( $kural );
	$platform_ayar = tilfy_otomasyon_platform_ayar_coz( $kural );
	$toplam        = 0;
	$paylasim_ids  = array();
	$arasi_dk      = max( 15, tilfy_otomasyon_arasi_dakika( $kural ) );
	$gunluk        = tilfy_otomasyon_gunluk_adet( $kural );
	$youtube_arasi = in_array( 'youtube', $hedefler, true );
	foreach ( $adaylar as $sira => $icerik ) {
		$ortak = array( 'kaynak' => 'otomasyon' );
		if ( $youtube_arasi && (int) $sira > 0 ) {
			$bas_ts = (int) current_time( 'timestamp' );
			if ( $gunluk > 1 && function_exists( 'tilfy_zamanlama_slot_ts' ) && function_exists( 'tilfy_zamanlama_ts_to_input' ) ) {
				$slot_ts = tilfy_zamanlama_slot_ts( tilfy_zamanlama_ts_to_input( $bas_ts ), (int) $sira, $gunluk, $arasi_dk );
			} else {
				$slot_ts = $bas_ts + ( (int) $sira * $arasi_dk * 60 );
			}
			$zaman = tilfy_otomasyon_slot_datetime( $slot_ts );
			if ( $zaman !== '' ) {
				$ortak['zamanlama'] = $zaman;
			}
		}
		$sonuc = tilfy_otomasyon_capraz_yurut(
			(int) $icerik->id,
			$hedefler,
			$ortak,
			$kaynak,
			$platform_ayar,
			false
		);
		$ids = array_map( 'intval', (array) ( $sonuc['paylasim_ids'] ?? array() ) );
		if ( empty( $ids ) ) {
			tilfy_otomasyon_kayit_ekle( (int) $kural->id, (int) $icerik->id, array(), 'atlandi' );
			continue;
		}
		tilfy_otomasyon_kayit_ekle( (int) $kural->id, (int) $icerik->id, $ids, 'baslatildi' );
		$paylasim_ids = array_merge( $paylasim_ids, $ids );
		$toplam      += count( $ids );
	}
	if ( $toplam > 0 && function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
		tilfy_kuyruk_arka_plan_tetik();
	}
	if ( function_exists( 'tilfy_islem_log' ) && $toplam > 0 ) {
		tilfy_islem_log(
			'otomasyon',
			'Kural #' . (int) $kural->id . ': ' . count( $adaylar ) . ' aday, ' . $toplam . ' paylasim',
			array( 'paylasim_ids' => $paylasim_ids )
		);
	}
	return array(
		'ok'           => true,
		'mesaj'        => $toplam > 0 ? 'Paylasimlar baslatildi' : 'Uygun aday paylasilamadi',
		'adet'         => $toplam,
		'paylasim_ids' => $paylasim_ids,
	);
}

function tilfy_otomasyon_kural_isle_premiere( $kural ) {
	$oid = (int) $kural->id;
	if ( ! tilfy_otomasyon_kural_lock_al( $oid ) ) {
		return array( 'ok' => false, 'mesaj' => 'Kural kilidi alinamadi', 'adet' => 0 );
	}
	try {
		$sonuc_batch = tilfy_otomasyon_batch_sonraki_kontrol( $kural );
		if ( tilfy_otomasyon_batch_kural_mesgul( $oid ) ) {
			$adet = (int) ( $sonuc_batch['adet'] ?? 0 );
			if ( $adet > 0 ) {
				if ( function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
					tilfy_kuyruk_arka_plan_tetik();
				}
				return $sonuc_batch;
			}
			return array( 'ok' => true, 'mesaj' => 'Aktif batch var', 'adet' => 0 );
		}
		$adaylar = tilfy_otomasyon_icerik_adaylari( $kural );
		if ( empty( $adaylar ) ) {
			$adet = (int) ( $sonuc_batch['adet'] ?? 0 );
			if ( $adet > 0 ) {
				if ( function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
					tilfy_kuyruk_arka_plan_tetik();
				}
				return $sonuc_batch;
			}
			return array( 'ok' => true, 'mesaj' => 'Yeni aday yok', 'adet' => 0 );
		}
		$batch_id = tilfy_otomasyon_batch_olustur( $kural, $adaylar, 'bekliyor' );
		if ( $batch_id <= 0 ) {
			return array( 'ok' => false, 'mesaj' => 'Batch olusturulamadi' );
		}
		$sonuc = tilfy_otomasyon_batch_planla( $kural, $batch_id );
		if ( (int) ( $sonuc['adet'] ?? 0 ) > 0 && function_exists( 'tilfy_kuyruk_arka_plan_tetik' ) ) {
			tilfy_kuyruk_arka_plan_tetik();
		}
		if ( function_exists( 'tilfy_islem_log' ) && (int) ( $sonuc['adet'] ?? 0 ) > 0 ) {
			tilfy_islem_log(
				'otomasyon',
				'Kural #' . $oid . ': batch #' . $batch_id . ' planlandi, ' . (int) $sonuc['adet'] . ' paylasim',
				array( 'paylasim_ids' => $sonuc['paylasim_ids'] ?? array() )
			);
		}
		return $sonuc;
	} finally {
		tilfy_otomasyon_kural_lock_birak( $oid );
	}
}

function tilfy_otomasyon_kural_isle( $kural ) {
	if ( ! $kural || empty( $kural->aktif ) ) {
		return array( 'ok' => false, 'mesaj' => 'Kural aktif degil' );
	}
	$tip  = sanitize_key( (string) ( $kural->tip ?? 'capraz' ) );
	$ozel = apply_filters( 'tilfy_otomasyon_kural_isle', null, $kural, $tip );
	if ( is_array( $ozel ) ) {
		return $ozel;
	}
	if ( $tip !== '' && $tip !== 'capraz' ) {
		tilfy_otomasyon_son_kontrol_guncelle( (int) $kural->id );
		return array(
			'ok'    => false,
			'mesaj' => 'Motor eklentisi gerekli (' . $tip . ')',
			'adet'  => 0,
		);
	}
	$kaynak   = sanitize_key( (string) $kural->kaynak_platform );
	$hedefler = tilfy_otomasyon_hedefleri_coz( $kural );
	if ( $kaynak === '' || empty( $hedefler ) ) {
		tilfy_otomasyon_son_kontrol_guncelle( (int) $kural->id );
		return array( 'ok' => false, 'mesaj' => 'Kaynak veya hedef eksik' );
	}
	$baglanti = function_exists( 'tilfy_baglanti_durumu' ) ? tilfy_baglanti_durumu() : array();
	if ( empty( $baglanti[ $kaynak ]['bagli'] ) ) {
		tilfy_otomasyon_son_kontrol_guncelle( (int) $kural->id );
		return array( 'ok' => false, 'mesaj' => 'Kaynak bagli degil' );
	}
	if ( function_exists( 'tilfy_zamanlanmis_paylasim_kuyruga_al' ) ) {
		tilfy_zamanlanmis_paylasim_kuyruga_al();
	}
	$senkron = tilfy_otomasyon_kaynak_senkron( $kaynak );
	if ( function_exists( 'tilfy_islem_log' ) ) {
		tilfy_islem_log(
			'otomasyon',
			'Kural #' . (int) $kural->id . ' senkron: ' . ( $senkron['mesaj'] ?? '' ),
			array( 'kaynak' => $kaynak )
		);
	}
	if ( tilfy_otomasyon_premiere_aktif_mi( $kural ) ) {
		$sonuc = tilfy_otomasyon_kural_isle_premiere( $kural );
	} else {
		$sonuc = tilfy_otomasyon_kural_isle_anlik( $kural );
	}
	tilfy_otomasyon_son_kontrol_guncelle( (int) $kural->id );
	return $sonuc;
}

function tilfy_otomasyon_kural_isle_id( $otomasyon_id ) {
	$kural = tilfy_otomasyon_al( $otomasyon_id );
	if ( ! $kural ) {
		return array( 'ok' => false, 'mesaj' => 'Kural bulunamadi' );
	}
	return tilfy_otomasyon_kural_isle( $kural );
}

function tilfy_otomasyon_dongu() {
	static $calisti = false;
	if ( $calisti ) {
		return;
	}
	$calisti = true;
	global $wpdb;
	$kurallar = $wpdb->get_results(
		'SELECT * FROM ' . tilfy_tablo( 'otomasyon' ) . ' WHERE aktif = 1 ORDER BY id ASC'
	);
	foreach ( (array) $kurallar as $kural ) {
		if ( ! tilfy_otomasyon_kontrol_zamani_geldi( $kural ) ) {
			continue;
		}
		tilfy_otomasyon_kural_isle( $kural );
	}
	if ( function_exists( 'tilfy_otomasyon_batch_sirali_tum_kontrol' ) ) {
		tilfy_otomasyon_batch_sirali_tum_kontrol();
	}
}
