<?php

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

function tilfy_yinelenen_aktif_durumlar() {
	return array( 'beklemede', 'yukleniyor', 'zamanlandi', 'sirada', 'yuklendi', 'manuel_bekliyor' );
}

function tilfy_yinelenen_koruma_modu() {
	$mod = sanitize_key( (string) tilfy_ayar_al( 'yinelenen_koruma', 'uyari' ) );
	return in_array( $mod, array( 'kapali', 'uyari', 'engelle' ), true ) ? $mod : 'uyari';
}

function tilfy_yinelenen_kontrol( $icerik_id, $hedef_platform ) {
	$mod = tilfy_yinelenen_koruma_modu();
	if ( $mod === 'kapali' ) {
		return null;
	}
	global $wpdb;
	$icerik_id      = (int) $icerik_id;
	$hedef_platform = sanitize_key( $hedef_platform );
	if ( $icerik_id <= 0 || $hedef_platform === '' ) {
		return null;
	}
	$durumlar   = tilfy_yinelenen_aktif_durumlar();
	$durum_yer  = implode( ',', array_fill( 0, count( $durumlar ), '%s' ) );
	$degerler   = array_merge( array( $icerik_id, $hedef_platform ), $durumlar );
	$paylasim_t = tilfy_tablo( 'paylasim' );
	$mevcut     = (int) $wpdb->get_var(
		$wpdb->prepare(
			"SELECT COUNT(*) FROM {$paylasim_t} WHERE icerik_id = %d AND hedef_platform = %s AND durum IN ({$durum_yer})",
			$degerler
		)
	);
	if ( $mevcut > 0 ) {
		return array(
			'tur'    => 'icerik_platform',
			'mesaj'  => sprintf( tilfy__( '%s için bu içerikte zaten paylaşım kaydı var.' ), tilfy_platform_etiket( $hedef_platform ) ),
			'platform' => $hedef_platform,
		);
	}
	$icerik = $wpdb->get_row(
		$wpdb->prepare(
			'SELECT kaynak_platform, kaynak_id FROM ' . tilfy_tablo( 'icerik' ) . ' WHERE id = %d',
			$icerik_id
		)
	);
	if ( ! $icerik || (string) $icerik->kaynak_id === '' ) {
		return null;
	}
	$icerik_t = tilfy_tablo( 'icerik' );
	$k_deger  = array_merge(
		array( $icerik->kaynak_platform, $icerik->kaynak_id, $hedef_platform, $icerik_id ),
		$durumlar
	);
	$kaynak_mevcut = (int) $wpdb->get_var(
		$wpdb->prepare(
			"SELECT COUNT(*) FROM {$paylasim_t} p
			INNER JOIN {$icerik_t} i ON i.id = p.icerik_id
			WHERE i.kaynak_platform = %s AND i.kaynak_id = %s AND p.hedef_platform = %s AND p.icerik_id != %d
			AND p.durum IN ({$durum_yer})",
			$k_deger
		)
	);
	if ( $kaynak_mevcut > 0 ) {
		return array(
			'tur'      => 'kaynak_platform',
			'mesaj'    => 'Aynı kaynak içerik ' . tilfy_platform_etiket( $hedef_platform ) . ' hedefine daha önce paylaşıldı.',
			'platform' => $hedef_platform,
		);
	}
	return null;
}

function tilfy_paylasim_platform_yinelenen_filtre( $icerik_id, $platformlar, $zorla = false, $arka_plan = false ) {
	$platformlar = array_values( array_filter( array_map( 'sanitize_key', (array) $platformlar ), 'tilfy_platform_aktif_mi' ) );
	if ( $zorla || tilfy_yinelenen_koruma_modu() === 'kapali' ) {
		return array(
			'platformlar' => $platformlar,
			'uyarilar'    => array(),
			'engellenen'  => array(),
		);
	}
	$mod         = tilfy_yinelenen_koruma_modu();
	$izin        = array();
	$uyarilar    = array();
	$engellenen  = array();
	foreach ( $platformlar as $platform ) {
		$bulgu = tilfy_yinelenen_kontrol( $icerik_id, $platform );
		if ( ! $bulgu ) {
			$izin[] = $platform;
			continue;
		}
		if ( $mod === 'engelle' || $arka_plan ) {
			$engellenen[] = $bulgu;
			continue;
		}
		$izin[]     = $platform;
		$uyarilar[] = $bulgu;
	}
	return array(
		'platformlar' => $izin,
		'uyarilar'    => $uyarilar,
		'engellenen'  => $engellenen,
	);
}

function tilfy_paylasim_icerik_platform_yuklendi_bul( $icerik_id, $platform, $haric_paylasim_id = 0 ) {
	global $wpdb;
	$icerik_id          = (int) $icerik_id;
	$haric_paylasim_id  = (int) $haric_paylasim_id;
	$platform           = sanitize_key( (string) $platform );
	if ( $icerik_id <= 0 || $platform === '' ) {
		return null;
	}
	return $wpdb->get_row(
		$wpdb->prepare(
			'SELECT id, hedef_id, hedef_url FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE icerik_id = %d AND hedef_platform = %s AND durum = 'yuklendi' AND hedef_id IS NOT NULL AND hedef_id <> '' AND id <> %d ORDER BY id ASC LIMIT 1",
			$icerik_id,
			$platform,
			$haric_paylasim_id
		)
	);
}

function tilfy_paylasim_yinelenen_esitle( $paylasim_id, $kaynak ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 || ! $kaynak ) {
		return false;
	}
	$wpdb->update(
		tilfy_tablo( 'paylasim' ),
		array(
			'durum'       => 'yuklendi',
			'hedef_id'    => sanitize_text_field( (string) ( $kaynak->hedef_id ?? '' ) ),
			'hedef_url'   => esc_url_raw( (string) ( $kaynak->hedef_url ?? '' ) ),
			'hata_mesaji' => '',
			'guncelleme'  => current_time( 'mysql' ),
		),
		array( 'id' => $paylasim_id )
	);
	if ( function_exists( 'tilfy_kuyruk_paylasim_iptal' ) ) {
		tilfy_kuyruk_paylasim_iptal( $paylasim_id );
	}
	if ( function_exists( 'tilfy_islem_log' ) ) {
		tilfy_islem_log(
			'yukleme',
			'Yinelenen atlandi; #' . (int) ( $kaynak->id ?? 0 ) . ' kullanildi',
			array( 'paylasim_id' => $paylasim_id )
		);
	}
	return true;
}

function tilfy_paylasim_icerik_platform_hedef_bul( $icerik_id, $platform, $haric_paylasim_id = 0 ) {
	global $wpdb;
	$icerik_id         = (int) $icerik_id;
	$haric_paylasim_id = (int) $haric_paylasim_id;
	$platform          = sanitize_key( (string) $platform );
	if ( $icerik_id <= 0 || $platform === '' ) {
		return null;
	}
	return $wpdb->get_row(
		$wpdb->prepare(
			'SELECT id, hedef_id, hedef_url, durum FROM ' . tilfy_tablo( 'paylasim' ) . " WHERE icerik_id = %d AND hedef_platform = %s AND hedef_id IS NOT NULL AND hedef_id <> '' AND id <> %d ORDER BY FIELD(durum,'yuklendi','manuel_bekliyor','yukleniyor','beklemede','zamanlandi','hata'), id ASC LIMIT 1",
			$icerik_id,
			$platform,
			$haric_paylasim_id
		)
	);
}

function tilfy_kuyruk_paylasim_video_id_bul( $paylasim_id ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return null;
	}
	$rows = $wpdb->get_results(
		"SELECT id, islem, durum, payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'youtube_sonrasi' ORDER BY FIELD(durum,'tamam','calisiyor','beklemede','hata'), id DESC LIMIT 40"
	);
	foreach ( (array) $rows as $satir ) {
		$payload = json_decode( (string) $satir->payload, true );
		if ( ! is_array( $payload ) || (int) ( $payload['paylasim_id'] ?? 0 ) !== $paylasim_id ) {
			continue;
		}
		$video_id = sanitize_text_field( (string) ( $payload['video_id'] ?? '' ) );
		if ( $video_id === '' ) {
			continue;
		}
		return (object) array(
			'id'        => 0,
			'hedef_id'  => $video_id,
			'hedef_url' => 'https://www.youtube.com/watch?v=' . rawurlencode( $video_id ),
			'kuyruk_id' => (int) $satir->id,
		);
	}
	return null;
}

function tilfy_yuklenmis_paylasim_kaynak_coz( $paylasim_id, $harita = null, $kanal_dene = true ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return null;
	}
	$paylasim = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . tilfy_tablo( 'paylasim' ) . ' WHERE id = %d', $paylasim_id ) );
	if ( ! $paylasim ) {
		return null;
	}
	if ( (string) $paylasim->hedef_id !== '' ) {
		return (object) array(
			'neden'              => 'hedef_id_mevcut',
			'kaynak_paylasim_id' => $paylasim_id,
			'hedef_id'           => (string) $paylasim->hedef_id,
			'hedef_url'          => (string) $paylasim->hedef_url,
		);
	}
	$kardes = tilfy_paylasim_icerik_platform_hedef_bul( (int) $paylasim->icerik_id, (string) $paylasim->hedef_platform, $paylasim_id );
	if ( $kardes ) {
		return (object) array(
			'neden'              => 'kardes_paylasim',
			'kaynak_paylasim_id' => (int) $kardes->id,
			'hedef_id'           => (string) $kardes->hedef_id,
			'hedef_url'          => (string) $kardes->hedef_url,
		);
	}
	$kuyruk = tilfy_kuyruk_paylasim_video_id_bul( $paylasim_id );
	if ( $kuyruk ) {
		return (object) array(
			'neden'              => 'kuyruk_video_id',
			'kaynak_paylasim_id' => 0,
			'hedef_id'           => (string) $kuyruk->hedef_id,
			'hedef_url'          => (string) $kuyruk->hedef_url,
			'kuyruk_id'          => (int) ( $kuyruk->kuyruk_id ?? 0 ),
		);
	}
	if ( $kanal_dene && sanitize_key( (string) $paylasim->hedef_platform ) === 'youtube' && function_exists( 'tilfy_youtube_paylasim_kanal_eslestir' ) ) {
		$icerik = $wpdb->get_row( $wpdb->prepare( 'SELECT * FROM ' . tilfy_tablo( 'icerik' ) . ' WHERE id = %d', (int) $paylasim->icerik_id ) );
		$kanal  = tilfy_youtube_paylasim_kanal_eslestir( $paylasim, $icerik, $harita );
		if ( $kanal ) {
			return $kanal;
		}
	}
	return null;
}

function tilfy_yuklenmis_analiz_neden_etiket( $neden, $ekstra = array() ) {
	$ekstra = is_array( $ekstra ) ? $ekstra : array();
	switch ( (string) $neden ) {
		case 'hedef_id_mevcut':
			return 'Kayıtta video ID var, durum güncellenmeli';
		case 'kardes_paylasim':
			$kid = (int) ( $ekstra['kaynak_paylasim_id'] ?? 0 );
			return $kid > 0 ? 'Aynı içerik paylaşım #' . $kid . ' ile zaten yüklü' : 'Aynı içerik başka paylaşımda yüklü';
		case 'kuyruk_video_id':
			return 'Kuyruk geçmişinden video ID bulundu';
		case 'kuyruk_gereksiz':
			return 'Paylaşım zaten yüklü; bekleyen kuyruk gereksiz';
		case 'kuyruk_cift':
			return 'Aynı paylaşım için yinelenen kuyruk satırı';
		case 'youtube_kanal_baslik':
			return 'YouTube kanalında aynı başlık bulundu';
		case 'youtube_kanal_playlist':
			return 'YouTube kanalında bulundu ve hedef playlist\'te';
		default:
			return (string) $neden;
	}
}

function tilfy_yuklenmis_analiz_tara( $kanal_tara = false ) {
	global $wpdb;
	$pt     = tilfy_tablo( 'paylasim' );
	$it     = tilfy_tablo( 'icerik' );
	$kt     = tilfy_tablo( 'kuyruk' );
	$bulgu  = array();
	$anahtar = array();
	$harita = null;
	$kanal_mesaj = '';

	if ( function_exists( 'tilfy_youtube_kanal_harita_al' ) ) {
		if ( $kanal_tara ) {
			$harita = tilfy_youtube_kanal_harita_yenile();
			$kanal_mesaj = is_array( $harita ) ? (string) ( $harita['mesaj'] ?? '' ) : '';
		} else {
			$harita = tilfy_youtube_kanal_harita_al( false );
		}
	}

	$paylasimlar = $wpdb->get_results(
		"SELECT p.*, i.baslik, i.kapak_url, i.aciklama FROM {$pt} p
		LEFT JOIN {$it} i ON i.id = p.icerik_id
		WHERE p.durum IN ('beklemede','yukleniyor','zamanlandi')
		ORDER BY p.id ASC"
	);
	foreach ( (array) $paylasimlar as $p ) {
		$kaynak = tilfy_yuklenmis_paylasim_kaynak_coz( (int) $p->id, $harita, true );
		if ( ! $kaynak || (string) $kaynak->hedef_id === '' ) {
			continue;
		}
		if ( (string) $p->durum === 'yuklendi' && (string) $p->hedef_id !== '' ) {
			continue;
		}
		$kuyruk_idler = array();
		if ( function_exists( 'tilfy_kuyruk_paylasim_bekleyen_idler' ) ) {
			$kuyruk_idler = tilfy_kuyruk_paylasim_bekleyen_idler( (int) $p->id );
		}
		$anahtar_str = 'paylasim-' . (int) $p->id;
		$anahtar[ $anahtar_str ] = true;
		$bulgu[] = array(
			'analiz_id'          => $anahtar_str,
			'tur'                => 'paylasim',
			'paylasim_id'        => (int) $p->id,
			'icerik_id'          => (int) $p->icerik_id,
			'hedef_platform'     => (string) $p->hedef_platform,
			'durum'              => (string) $p->durum,
			'baslik'             => sanitize_text_field( (string) ( $p->baslik ?? '' ) ),
			'kapak_url'          => esc_url_raw( (string) ( $p->kapak_url ?? '' ) ),
			'video_id'           => sanitize_text_field( (string) $kaynak->hedef_id ),
			'hedef_url'          => esc_url_raw( (string) $kaynak->hedef_url ),
			'kaynak_paylasim_id' => (int) ( $kaynak->kaynak_paylasim_id ?? 0 ),
			'neden'              => (string) $kaynak->neden,
			'neden_etiket'       => tilfy_yuklenmis_analiz_neden_etiket( (string) $kaynak->neden, (array) $kaynak ),
			'youtube_baslik'     => sanitize_text_field( (string) ( $kaynak->youtube_baslik ?? '' ) ),
			'kuyruk_idler'       => array_map( 'intval', (array) $kuyruk_idler ),
			'onerilen'           => 'eslestir',
		);
	}

	$kuyruk_satirlar = $wpdb->get_results(
		"SELECT * FROM {$kt} WHERE durum IN ('beklemede','calisiyor') AND islem IN ('paylasim_gonder','youtube_sonrasi') ORDER BY id ASC"
	);
	$paylasim_kuyruk_say = array();
	foreach ( (array) $kuyruk_satirlar as $is ) {
		$payload = json_decode( (string) $is->payload, true );
		if ( ! is_array( $payload ) ) {
			$payload = array();
		}
		$pid = (int) ( $payload['paylasim_id'] ?? 0 );
		if ( $pid <= 0 ) {
			continue;
		}
		if ( ! isset( $paylasim_kuyruk_say[ $pid ] ) ) {
			$paylasim_kuyruk_say[ $pid ] = array();
		}
		$paylasim_kuyruk_say[ $pid ][] = (int) $is->id;
	}

	foreach ( (array) $kuyruk_satirlar as $is ) {
		$payload = json_decode( (string) $is->payload, true );
		if ( ! is_array( $payload ) ) {
			$payload = array();
		}
		$pid    = (int) ( $payload['paylasim_id'] ?? 0 );
		$icerik = (int) ( $payload['icerik_id'] ?? 0 );
		if ( $pid <= 0 ) {
			continue;
		}
		$paylasim = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$pt} WHERE id = %d", $pid ) );
		if ( ! $paylasim ) {
			continue;
		}
		$neden = '';
		if ( (string) $paylasim->durum === 'yuklendi' && (string) $paylasim->hedef_id !== '' ) {
			$neden = 'kuyruk_gereksiz';
		} elseif ( tilfy_yuklenmis_paylasim_kaynak_coz( $pid ) ) {
			$neden = 'kuyruk_gereksiz';
		} elseif ( isset( $paylasim_kuyruk_say[ $pid ] ) && count( $paylasim_kuyruk_say[ $pid ] ) > 1 && (int) $paylasim_kuyruk_say[ $pid ][0] !== (int) $is->id ) {
			$neden = 'kuyruk_cift';
		}
		if ( $neden === '' ) {
			continue;
		}
		$anahtar_str = 'kuyruk-' . (int) $is->id;
		if ( isset( $anahtar[ $anahtar_str ] ) ) {
			continue;
		}
		$anahtar[ $anahtar_str ] = true;
		$icerik_satir = $icerik > 0 ? $wpdb->get_row( $wpdb->prepare( "SELECT baslik, kapak_url FROM {$it} WHERE id = %d", $icerik ) ) : null;
		$video_id  = sanitize_text_field( (string) $paylasim->hedef_id );
		$hedef_url = esc_url_raw( (string) $paylasim->hedef_url );
		if ( $video_id === '' ) {
			$coz = tilfy_yuklenmis_paylasim_kaynak_coz( $pid );
			if ( $coz ) {
				$video_id  = sanitize_text_field( (string) $coz->hedef_id );
				$hedef_url = esc_url_raw( (string) $coz->hedef_url );
			}
		}
		$bulgu[] = array(
			'analiz_id'      => $anahtar_str,
			'tur'            => 'kuyruk',
			'kuyruk_id'      => (int) $is->id,
			'kuyruk_islem'   => (string) $is->islem,
			'kuyruk_durum'   => (string) $is->durum,
			'paylasim_id'    => $pid,
			'icerik_id'      => $icerik > 0 ? $icerik : (int) $paylasim->icerik_id,
			'hedef_platform' => (string) $paylasim->hedef_platform,
			'durum'          => (string) $paylasim->durum,
			'baslik'         => sanitize_text_field( (string) ( $icerik_satir->baslik ?? '' ) ),
			'kapak_url'      => esc_url_raw( (string) ( $icerik_satir->kapak_url ?? '' ) ),
			'video_id'       => $video_id,
			'hedef_url'      => $hedef_url,
			'neden'          => $neden,
			'neden_etiket'   => tilfy_yuklenmis_analiz_neden_etiket( $neden, array( 'paylasim_id' => $pid ) ),
			'kuyruk_idler'   => array( (int) $is->id ),
			'onerilen'       => 'kuyruk_sil',
		);
	}

	return array(
		'bulgular'    => $bulgu,
		'kanal_mesaj' => $kanal_mesaj,
		'ozet'        => array(
			'toplam'   => count( $bulgu ),
			'paylasim' => count( array_filter( $bulgu, function ( $b ) {
				return ( $b['tur'] ?? '' ) === 'paylasim';
			} ) ),
			'kuyruk'   => count( array_filter( $bulgu, function ( $b ) {
				return ( $b['tur'] ?? '' ) === 'kuyruk';
			} ) ),
			'kanal'    => count( array_filter( $bulgu, function ( $b ) {
				return in_array( (string) ( $b['neden'] ?? '' ), array( 'youtube_kanal_baslik', 'youtube_kanal_playlist' ), true );
			} ) ),
		),
	);
}

function tilfy_paylasim_yuklenmis_tamamla( $paylasim_id ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 ) {
		return false;
	}
	$kaynak = tilfy_yuklenmis_paylasim_kaynak_coz( $paylasim_id );
	if ( ! $kaynak || (string) $kaynak->hedef_id === '' ) {
		return false;
	}
	$kid = (int) ( $kaynak->kaynak_paylasim_id ?? 0 );
	if ( $kid > 0 && $kid !== $paylasim_id ) {
		$kaynak_satir = $wpdb->get_row( $wpdb->prepare( 'SELECT id, hedef_id, hedef_url FROM ' . tilfy_tablo( 'paylasim' ) . ' WHERE id = %d', $kid ) );
		if ( $kaynak_satir ) {
			return tilfy_paylasim_yinelenen_esitle( $paylasim_id, $kaynak_satir );
		}
	}
	$wpdb->update(
		tilfy_tablo( 'paylasim' ),
		array(
			'durum'       => 'yuklendi',
			'hedef_id'    => sanitize_text_field( (string) $kaynak->hedef_id ),
			'hedef_url'   => esc_url_raw( (string) $kaynak->hedef_url ),
			'hata_mesaji' => '',
			'guncelleme'  => current_time( 'mysql' ),
		),
		array( 'id' => $paylasim_id )
	);
	if ( function_exists( 'tilfy_kuyruk_paylasim_iptal' ) ) {
		tilfy_kuyruk_paylasim_iptal( $paylasim_id );
	}
	if ( function_exists( 'tilfy_islem_log' ) ) {
		tilfy_islem_log( 'yukleme', 'Analiz: zaten yuklu, eslestirildi (' . (string) $kaynak->hedef_id . ')', array( 'paylasim_id' => $paylasim_id ) );
	}
	return true;
}

function tilfy_yuklenmis_analiz_uygula( $eslestir = array(), $kuyruk_sil = array(), $iptal = array() ) {
	$eslestir   = array_values( array_unique( array_filter( array_map( 'intval', (array) $eslestir ) ) ) );
	$kuyruk_sil = array_values( array_unique( array_filter( array_map( 'intval', (array) $kuyruk_sil ) ) ) );
	$iptal      = array_values( array_unique( array_filter( array_map( 'intval', (array) $iptal ) ) ) );
	$sonuc = array(
		'eslestirilen' => 0,
		'kuyruk_silinen' => 0,
		'iptal'        => 0,
	);
	foreach ( $eslestir as $pid ) {
		if ( tilfy_paylasim_yuklenmis_tamamla( $pid ) ) {
			++$sonuc['eslestirilen'];
		}
	}
	if ( ! empty( $kuyruk_sil ) && function_exists( 'tilfy_kuyruk_satirlari_sil' ) ) {
		$ks = tilfy_kuyruk_satirlari_sil( $kuyruk_sil, false, false );
		$sonuc['kuyruk_silinen'] = (int) ( $ks['silinen'] ?? 0 );
	}
	if ( ! empty( $iptal ) && function_exists( 'tilfy_paylasim_bekleyen_iptal' ) ) {
		$sonuc['iptal'] = tilfy_paylasim_bekleyen_iptal( $iptal );
	}
	return $sonuc;
}

function tilfy_yuklenmis_analiz_tum_eslestir() {
	global $wpdb;
	$tarama = tilfy_yuklenmis_analiz_tara( true );
	$ids    = array();
	foreach ( (array) ( $tarama['bulgular'] ?? array() ) as $bulgu ) {
		if ( ( $bulgu['tur'] ?? '' ) === 'paylasim' && (int) ( $bulgu['paylasim_id'] ?? 0 ) > 0 ) {
			$ids[] = (int) $bulgu['paylasim_id'];
		}
	}
	$kuyruk = array();
	foreach ( (array) ( $tarama['bulgular'] ?? array() ) as $bulgu ) {
		if ( ( $bulgu['tur'] ?? '' ) === 'kuyruk' && (int) ( $bulgu['kuyruk_id'] ?? 0 ) > 0 ) {
			$kuyruk[] = (int) $bulgu['kuyruk_id'];
		}
	}
	return tilfy_yuklenmis_analiz_uygula( $ids, $kuyruk, array() );
}
