<?php

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

function tilfy_youtube_baslik_normalize( $metin ) {
	$metin = wp_strip_all_tags( (string) $metin );
	$metin = html_entity_decode( $metin, ENT_QUOTES, 'UTF-8' );
	$metin = preg_replace( '/\s+/u', ' ', trim( $metin ) );
	if ( function_exists( 'mb_strtolower' ) ) {
		return mb_strtolower( $metin, 'UTF-8' );
	}
	return strtolower( $metin );
}

function tilfy_youtube_kanal_harita_onbellek_anahtar() {
	$kanal = (string) tilfy_ayar_al( 'youtube_kanal_id' );
	return 'tilfy_yt_kanal_harita_' . md5( $kanal !== '' ? $kanal : 'bos' );
}

function tilfy_youtube_playlist_video_id_set( $playlist_id, $max_sayfa = 4 ) {
	$playlist_id = sanitize_text_field( (string) $playlist_id );
	if ( $playlist_id === '' ) {
		return array();
	}
	if ( ! function_exists( 'tilfy_youtube_api_istek' ) ) {
		$dosya = defined( 'TILFY_YOL' ) ? TILFY_YOL . 'includes/api/youtube.php' : '';
		if ( $dosya !== '' && is_readable( $dosya ) ) {
			require_once $dosya;
		}
	}
	if ( ! function_exists( 'tilfy_youtube_api_istek' ) ) {
		return array();
	}
	$set        = array();
	$page_token = '';
	$sayfa      = 0;
	do {
		++$sayfa;
		$args = array(
			'part'       => 'contentDetails',
			'playlistId' => $playlist_id,
			'maxResults' => 50,
		);
		if ( $page_token !== '' ) {
			$args['pageToken'] = $page_token;
		}
		$veri = tilfy_youtube_api_istek( 'playlistItems', $args );
		if ( is_wp_error( $veri ) ) {
			break;
		}
		foreach ( (array) ( $veri['items'] ?? array() ) as $oge ) {
			$video_id = sanitize_text_field( (string) ( $oge['contentDetails']['videoId'] ?? '' ) );
			if ( $video_id !== '' ) {
				$set[ $video_id ] = true;
			}
		}
		$page_token = (string) ( $veri['nextPageToken'] ?? '' );
	} while ( $page_token !== '' && $sayfa < $max_sayfa );
	return $set;
}

function tilfy_youtube_kanal_harita_yenile( $max_sayfa = 8 ) {
	if ( ! function_exists( 'tilfy_youtube_yukleme_playlist_id' ) ) {
		$dosya = defined( 'TILFY_YOL' ) ? TILFY_YOL . 'includes/api/youtube.php' : '';
		if ( $dosya !== '' && is_readable( $dosya ) ) {
			require_once $dosya;
		}
	}
	$playlist_id = function_exists( 'tilfy_youtube_yukleme_playlist_id' ) ? tilfy_youtube_yukleme_playlist_id() : '';
	if ( $playlist_id === '' ) {
		return array(
			'ok'          => false,
			'mesaj'       => 'YouTube kanal veya yukleme listesi alinamadi',
			'baslik_indis'=> array(),
			'videolar'    => array(),
			'playlist'    => array(),
		);
	}
	$baslik_indis = array();
	$videolar     = array();
	$page_token   = '';
	$sayfa        = 0;
	do {
		++$sayfa;
		$args = array(
			'part'       => 'snippet,contentDetails',
			'playlistId' => $playlist_id,
			'maxResults' => 50,
		);
		if ( $page_token !== '' ) {
			$args['pageToken'] = $page_token;
		}
		$veri = tilfy_youtube_api_istek( 'playlistItems', $args );
		if ( is_wp_error( $veri ) ) {
			if ( empty( $videolar ) ) {
				return array(
					'ok'           => false,
					'mesaj'        => $veri->get_error_message(),
					'baslik_indis' => array(),
					'videolar'     => array(),
					'playlist'     => array(),
				);
			}
			break;
		}
		foreach ( (array) ( $veri['items'] ?? array() ) as $oge ) {
			$video_id = sanitize_text_field( (string) ( $oge['contentDetails']['videoId'] ?? ( $oge['snippet']['resourceId']['videoId'] ?? '' ) ) );
			if ( $video_id === '' ) {
				continue;
			}
			$sn    = $oge['snippet'] ?? array();
			$title = sanitize_text_field( (string) ( $sn['title'] ?? '' ) );
			$norm  = tilfy_youtube_baslik_normalize( $title );
			$pub   = (string) ( $sn['publishedAt'] ?? ( $oge['contentDetails']['videoPublishedAt'] ?? '' ) );
			$giris = array(
				'video_id'   => $video_id,
				'title'      => $title,
				'published'  => $pub,
				'hedef_url'  => 'https://www.youtube.com/watch?v=' . rawurlencode( $video_id ),
			);
			$videolar[ $video_id ] = $giris;
			if ( $norm !== '' ) {
				if ( ! isset( $baslik_indis[ $norm ] ) ) {
					$baslik_indis[ $norm ] = array();
				}
				$baslik_indis[ $norm ][] = $giris;
			}
		}
		$page_token = (string) ( $veri['nextPageToken'] ?? '' );
	} while ( $page_token !== '' && $sayfa < $max_sayfa );

	foreach ( $baslik_indis as $norm => $liste ) {
		usort(
			$liste,
			function ( $a, $b ) {
				return strcmp( (string) ( $b['published'] ?? '' ), (string) ( $a['published'] ?? '' ) );
			}
		);
		$baslik_indis[ $norm ] = $liste;
	}

	$playlist = array();
	$playlist_idler = array();
	$varsayilan     = sanitize_text_field( (string) tilfy_ayar_al( 'youtube_varsayilan_playlist', '' ) );
	if ( $varsayilan !== '' ) {
		$playlist_idler[] = $varsayilan;
	}
	global $wpdb;
	$ayar_satirlar = $wpdb->get_col(
		"SELECT platform_ayar FROM " . tilfy_tablo( 'paylasim' ) . " WHERE hedef_platform = 'youtube' AND durum IN ('beklemede','yukleniyor','zamanlandi') AND platform_ayar IS NOT NULL AND platform_ayar <> '' LIMIT 300"
	);
	foreach ( (array) $ayar_satirlar as $ham ) {
		$veri = json_decode( (string) $ham, true );
		if ( ! is_array( $veri ) ) {
			continue;
		}
		$pl = sanitize_text_field( (string) ( $veri['playlist_id'] ?? '' ) );
		if ( $pl !== '' ) {
			$playlist_idler[] = $pl;
		}
	}
	$playlist_idler = array_values( array_unique( $playlist_idler ) );
	foreach ( $playlist_idler as $pl_id ) {
		$playlist[ $pl_id ] = tilfy_youtube_playlist_video_id_set( $pl_id, 6 );
	}

	$harita = array(
		'ok'           => true,
		'mesaj'        => count( $videolar ) . ' kanal videosu',
		'baslik_indis' => $baslik_indis,
		'videolar'     => $videolar,
		'playlist'     => $playlist,
		'guncelleme'   => time(),
	);
	set_transient( tilfy_youtube_kanal_harita_onbellek_anahtar(), $harita, 30 * MINUTE_IN_SECONDS );
	return $harita;
}

function tilfy_youtube_kanal_harita_al( $tazele = false ) {
	if ( $tazele ) {
		return tilfy_youtube_kanal_harita_yenile();
	}
	$harita = get_transient( tilfy_youtube_kanal_harita_onbellek_anahtar() );
	return is_array( $harita ) ? $harita : null;
}

function tilfy_youtube_paylasim_baslik_al( $paylasim, $icerik ) {
	$baslik = trim( (string) ( $paylasim->ozel_baslik ?? '' ) );
	if ( $baslik === '' && $icerik ) {
		$baslik = trim( (string) ( $icerik->baslik ?? '' ) );
	}
	if ( $baslik === '' && $icerik ) {
		$baslik = wp_trim_words( wp_strip_all_tags( (string) ( $icerik->aciklama ?? '' ) ), 8, '' );
	}
	return sanitize_text_field( $baslik );
}

function tilfy_youtube_paylasim_kanal_eslestir( $paylasim, $icerik, $harita = null ) {
	if ( ! $paylasim || sanitize_key( (string) ( $paylasim->hedef_platform ?? '' ) ) !== 'youtube' ) {
		return null;
	}
	if ( (string) ( $paylasim->hedef_id ?? '' ) !== '' ) {
		return null;
	}
	if ( ! is_array( $harita ) || empty( $harita['baslik_indis'] ) ) {
		$harita = tilfy_youtube_kanal_harita_al( false );
	}
	if ( ! is_array( $harita ) || empty( $harita['baslik_indis'] ) ) {
		return null;
	}
	$baslik = tilfy_youtube_paylasim_baslik_al( $paylasim, $icerik );
	$norm   = tilfy_youtube_baslik_normalize( $baslik );
	if ( $norm === '' ) {
		return null;
	}
	$adaylar = $harita['baslik_indis'][ $norm ] ?? array();
	if ( empty( $adaylar ) ) {
		return null;
	}
	$secilen = $adaylar[0];
	$playlist_id = '';
	if ( function_exists( 'tilfy_paylasim_ayar_al' ) ) {
		$ayar = tilfy_paylasim_ayar_al( $paylasim );
		$playlist_id = sanitize_text_field( (string) ( $ayar['playlist_id'] ?? '' ) );
	}
	$playlistte = false;
	if ( $playlist_id !== '' && ! empty( $harita['playlist'][ $playlist_id ] ) ) {
		$playlistte = ! empty( $harita['playlist'][ $playlist_id ][ $secilen['video_id'] ] );
	}
	return (object) array(
		'neden'              => $playlistte ? 'youtube_kanal_playlist' : 'youtube_kanal_baslik',
		'kaynak_paylasim_id' => 0,
		'hedef_id'           => (string) $secilen['video_id'],
		'hedef_url'          => (string) $secilen['hedef_url'],
		'youtube_baslik'     => (string) $secilen['title'],
		'playlistte'         => $playlistte,
	);
}

function tilfy_paylasim_youtube_video_id_ata( $paylasim_id, $video_id, $kaynak = 'manuel' ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	$video_id    = sanitize_text_field( (string) $video_id );
	if ( $paylasim_id <= 0 || $video_id === '' ) {
		return false;
	}
	$wpdb->update(
		tilfy_tablo( 'paylasim' ),
		array(
			'durum'       => 'yuklendi',
			'hedef_id'    => $video_id,
			'hedef_url'   => 'https://www.youtube.com/watch?v=' . rawurlencode( $video_id ),
			'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', 'YouTube eslestirildi (' . $kaynak . '): ' . $video_id, array( 'paylasim_id' => $paylasim_id ) );
	}
	return true;
}

function tilfy_youtube_otomatik_eslestir_dene( $paylasim_id ) {
	global $wpdb;
	$paylasim_id = (int) $paylasim_id;
	if ( $paylasim_id <= 0 || ! function_exists( 'tilfy_yuklenmis_paylasim_kaynak_coz' ) || ! function_exists( 'tilfy_paylasim_yuklenmis_tamamla' ) ) {
		return false;
	}
	$paylasim = $wpdb->get_row( $wpdb->prepare( 'SELECT hedef_platform, durum FROM ' . tilfy_tablo( 'paylasim' ) . ' WHERE id = %d', $paylasim_id ) );
	if ( ! $paylasim || sanitize_key( (string) $paylasim->hedef_platform ) !== 'youtube' ) {
		return false;
	}
	if ( in_array( (string) $paylasim->durum, array( 'yuklendi', 'manuel_bekliyor' ), true ) ) {
		return false;
	}
	$harita = tilfy_youtube_kanal_harita_al( false );
	$kaynak = tilfy_yuklenmis_paylasim_kaynak_coz( $paylasim_id, $harita, true );
	if ( ! $kaynak ) {
		$son = (int) get_option( 'tilfy_yt_harita_son_yenileme', 0 );
		if ( time() - $son > 3600 ) {
			update_option( 'tilfy_yt_harita_son_yenileme', time(), false );
			$harita = tilfy_youtube_kanal_harita_yenile( 4 );
			$kaynak = tilfy_yuklenmis_paylasim_kaynak_coz( $paylasim_id, $harita, true );
		}
	}
	if ( ! $kaynak || (string) $kaynak->hedef_id === '' ) {
		return false;
	}
	return tilfy_paylasim_yuklenmis_tamamla( $paylasim_id );
}
