<?php

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

function tilfy_wp_upload_dir_ham( $time = null, $create_dir = true ) {
	$ekli = has_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
	if ( $ekli ) {
		remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
	}
	$upload = wp_upload_dir( $time, $create_dir );
	if ( $ekli ) {
		add_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
	}
	return $upload;
}

function tilfy_medya_uploads_kok() {
	$upload = tilfy_wp_upload_dir_ham();
	if ( ! empty( $upload['error'] ) || empty( $upload['basedir'] ) ) {
		return '';
	}
	return wp_normalize_path( untrailingslashit( $upload['basedir'] ) );
}

function tilfy_medya_uploads_kok_url() {
	$upload = tilfy_wp_upload_dir_ham();
	if ( ! empty( $upload['error'] ) || empty( $upload['baseurl'] ) ) {
		return '';
	}
	return trailingslashit( $upload['baseurl'] );
}

function tilfy_medya_depo_dizini() {
	$uploads = tilfy_medya_uploads_kok();
	if ( $uploads === '' ) {
		return '';
	}
	$varsayilan = trailingslashit( $uploads ) . 'tilfy-medya';
	$ozel       = trim( (string) tilfy_ayar_al( 'medya_klasor', '' ) );
	$yol        = $varsayilan;
	if ( $ozel !== '' ) {
		$ozel = str_replace( '\\', '/', $ozel );
		if (
			$ozel[0] !== '/'
			&& ! preg_match( '#^[A-Za-z]:/#', $ozel )
			&& strpos( $ozel, '..' ) === false
		) {
			$aday = wp_normalize_path( trailingslashit( $uploads ) . ltrim( $ozel, '/' ) );
			if ( strpos( $aday, trailingslashit( $uploads ) ) === 0 || $aday === $uploads ) {
				$yol = $aday;
			}
		}
	}
	$yol = wp_normalize_path( $yol );
	if ( ! is_dir( $yol ) ) {
		wp_mkdir_p( $yol );
	}
	foreach ( array( 'Video', 'Image', 'Thumbnails' ) as $alt_klasor ) {
		$alt_yol = trailingslashit( $yol ) . $alt_klasor;
		if ( ! is_dir( $alt_yol ) ) {
			wp_mkdir_p( $alt_yol );
		}
	}
	return trailingslashit( $yol );
}

function tilfy_medya_depo_url() {
	$ozel = trim( (string) tilfy_ayar_al( 'medya_klasor', '' ) );
	if ( $ozel === '' ) {
		return trailingslashit( tilfy_medya_uploads_kok_url() ) . 'tilfy-medya';
	}
	$yol     = wp_normalize_path( untrailingslashit( tilfy_medya_depo_dizini() ) );
	$basedir = tilfy_medya_uploads_kok();
	$baseurl = untrailingslashit( tilfy_medya_uploads_kok_url() );
	if ( $basedir !== '' && $baseurl !== '' && ( $yol === $basedir || strpos( $yol, trailingslashit( $basedir ) ) === 0 ) ) {
		$rel = ltrim( substr( $yol, strlen( $basedir ) ), '/' );
		return trailingslashit( $baseurl . ( $rel !== '' ? '/' . $rel : '' ) );
	}
	return trailingslashit( tilfy_medya_uploads_kok_url() ) . 'tilfy-medya';
}

function tilfy_medya_alt_klasor_adi( $tip = '' ) {
	$tip = sanitize_key( $tip !== '' ? $tip : (string) ( $GLOBALS['tilfy_medya_klasor_tipi'] ?? 'video' ) );
	$map = array(
		'video'     => 'Video',
		'image'     => 'Image',
		'thumbnail' => 'Thumbnails',
	);
	return $map[ $tip ] ?? 'Video';
}

function tilfy_medya_alt_klasor_yolu( $tip = '' ) {
	$depo = untrailingslashit( tilfy_medya_depo_dizini() );
	$alt  = tilfy_medya_alt_klasor_adi( $tip );
	$yol  = trailingslashit( $depo ) . $alt;
	if ( ! is_dir( $yol ) ) {
		wp_mkdir_p( $yol );
	}
	return trailingslashit( $yol );
}

function tilfy_medya_alt_klasor_url( $tip = '' ) {
	$depo_url = untrailingslashit( tilfy_medya_depo_url() );
	return trailingslashit( $depo_url ) . tilfy_medya_alt_klasor_adi( $tip );
}

function tilfy_medya_upload_dir_filtresi( $dirs ) {
	if ( empty( $GLOBALS['tilfy_medya_indiriyor'] ) ) {
		return $dirs;
	}
	if ( ! empty( $GLOBALS['tilfy_medya_upload_dir_filtre_aktif'] ) ) {
		return $dirs;
	}
	$GLOBALS['tilfy_medya_upload_dir_filtre_aktif'] = true;
	$tip     = sanitize_key( (string) ( $GLOBALS['tilfy_medya_klasor_tipi'] ?? 'video' ) );
	$alt_yol = tilfy_medya_alt_klasor_yolu( $tip );
	$alt_url = untrailingslashit( tilfy_medya_alt_klasor_url( $tip ) );
	$basedir = tilfy_medya_uploads_kok();
	$baseurl = untrailingslashit( tilfy_medya_uploads_kok_url() );
	$dirs['path']    = untrailingslashit( $alt_yol );
	$dirs['url']     = $alt_url;
	$dirs['subdir']  = '';
	$dirs['basedir'] = $basedir !== '' ? $basedir : untrailingslashit( wp_normalize_path( (string) ( $dirs['basedir'] ?? '' ) ) );
	$dirs['baseurl'] = $baseurl !== '' ? $baseurl : untrailingslashit( (string) ( $dirs['baseurl'] ?? '' ) );
	$GLOBALS['tilfy_medya_upload_dir_filtre_aktif'] = false;
	return $dirs;
}

function tilfy_medya_bagil_dosya_yolu( $mutlak_yol ) {
	$mutlak  = wp_normalize_path( (string) $mutlak_yol );
	$basedir = wp_normalize_path( (string) ( tilfy_wp_upload_dir_ham()['basedir'] ?? '' ) );
	if ( $mutlak !== '' && $basedir !== '' && strpos( $mutlak, $basedir ) === 0 ) {
		return ltrim( substr( $mutlak, strlen( $basedir ) ), '/' );
	}
	return wp_basename( $mutlak );
}

function tilfy_medya_dosya_klasore_kaydet( $tmp, $dosya_adi, $tip = 'video' ) {
	$tmp = (string) $tmp;
	if ( $tmp === '' || ! is_file( $tmp ) ) {
		return new WP_Error( 'tilfy_medya', 'Gecici dosya yok' );
	}
	$hedef_klasor = tilfy_medya_alt_klasor_yolu( $tip );
	$dosya_adi    = sanitize_file_name( (string) $dosya_adi );
	if ( $dosya_adi === '' ) {
		return new WP_Error( 'tilfy_medya', 'Dosya adi gecersiz' );
	}
	$hedef_yol = $hedef_klasor . $dosya_adi;
	$veri      = @file_get_contents( $tmp );
	if ( $veri === false || $veri === '' ) {
		return new WP_Error( 'tilfy_medya', 'Gecici dosya okunamadi' );
	}
	if ( ! @file_put_contents( $hedef_yol, $veri ) ) {
		return new WP_Error( 'tilfy_medya', 'Dosya yazilamadi: ' . $hedef_yol );
	}
	if ( ! is_file( $hedef_yol ) ) {
		return new WP_Error( 'tilfy_medya', 'Dosya diskte dogrulanamadi' );
	}
	return array(
		'file'  => $hedef_yol,
		'bagil' => tilfy_medya_bagil_dosya_yolu( $hedef_yol ),
		'size'  => (int) filesize( $hedef_yol ),
	);
}

function tilfy_medya_klasor_boyut( $tip = '' ) {
	$yol = tilfy_medya_alt_klasor_yolu( $tip );
	if ( ! is_dir( $yol ) ) {
		return 0;
	}
	$toplam = 0;
	try {
		$iterator = new RecursiveIteratorIterator(
			new RecursiveDirectoryIterator( $yol, RecursiveDirectoryIterator::SKIP_DOTS )
		);
		foreach ( $iterator as $dosya ) {
			if ( $dosya->isFile() ) {
				$toplam += (int) $dosya->getSize();
			}
		}
	} catch ( Exception $e ) {
		return 0;
	}
	return $toplam;
}

function tilfy_medya_gecici_isaretle( $attachment_id ) {
	$attachment_id = (int) $attachment_id;
	if ( $attachment_id <= 0 ) {
		return;
	}
	update_post_meta( $attachment_id, '_tilfy_gecici_medya', '1' );
}

function tilfy_kuyruk_icerik_medya_bekliyor_mu( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return false;
	}
	$satirlar = $wpdb->get_results(
		"SELECT payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'medya_indir' AND durum IN ('beklemede','calisiyor')"
	);
	foreach ( (array) $satirlar as $satir ) {
		$payload = json_decode( (string) $satir->payload, true );
		if ( is_array( $payload ) && (int) ( $payload['icerik_id'] ?? 0 ) === $icerik_id ) {
			return true;
		}
	}
	return false;
}

function tilfy_kuyruk_icerik_medya_indir_kalici_hata_mi( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return false;
	}
	$satirlar = $wpdb->get_results(
		"SELECT durum, hata, payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'medya_indir' ORDER BY id DESC LIMIT 40"
	);
	foreach ( (array) $satirlar as $satir ) {
		$payload = json_decode( (string) $satir->payload, true );
		if ( ! is_array( $payload ) || (int) ( $payload['icerik_id'] ?? 0 ) !== $icerik_id ) {
			continue;
		}
		if ( sanitize_key( (string) ( $satir->durum ?? '' ) ) !== 'hata' ) {
			return false;
		}
		$hata_kod = sanitize_key( (string) ( $satir->hata ?? '' ) );
		if ( in_array( $hata_kod, array( 'takili_iptal', 'senkron_iptal' ), true ) ) {
			return false;
		}
		return true;
	}
	return false;
}

function tilfy_kuyruk_icerik_medya_basarisiz_sifirla( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return 0;
	}
	$adet    = 0;
	$satirlar = $wpdb->get_results(
		"SELECT id, payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'medya_indir' AND durum = 'hata' ORDER BY id DESC LIMIT 80"
	);
	foreach ( (array) $satirlar as $satir ) {
		$payload = json_decode( (string) $satir->payload, true );
		if ( ! is_array( $payload ) || (int) ( $payload['icerik_id'] ?? 0 ) !== $icerik_id ) {
			continue;
		}
		if ( false !== $wpdb->delete( tilfy_tablo( 'kuyruk' ), array( 'id' => (int) $satir->id ), array( '%d' ) ) ) {
			++$adet;
		}
	}
	return $adet;
}

function tilfy_icerik_medya_indirme_bekliyor_mu( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return false;
	}
	$icerik = $wpdb->get_row(
		$wpdb->prepare( 'SELECT medya_dosya_id, medya_url, kaynak_platform, kaynak_id FROM ' . tilfy_tablo( 'icerik' ) . ' WHERE id = %d', $icerik_id )
	);
	if ( ! $icerik ) {
		return false;
	}
	if ( (int) $icerik->medya_dosya_id > 0 ) {
		if ( function_exists( 'tilfy_medya_dosya_gecerli_mi' ) && tilfy_medya_dosya_gecerli_mi( (int) $icerik->medya_dosya_id ) ) {
			return false;
		}
		if ( ! function_exists( 'tilfy_medya_dosya_gecerli_mi' ) ) {
			return false;
		}
	}
	if ( function_exists( 'tilfy_icerik_meta_uzaktan_medya_mi' ) && tilfy_icerik_meta_uzaktan_medya_mi( $icerik ) ) {
		return true;
	}
	return trim( (string) $icerik->medya_url ) !== '';
}

function tilfy_medya_silinemez_mi( $attachment_id ) {
	global $wpdb;
	$attachment_id = (int) $attachment_id;
	if ( $attachment_id <= 0 ) {
		return true;
	}
	$kapak_kullanim = (int) $wpdb->get_var(
		$wpdb->prepare(
			'SELECT COUNT(*) FROM ' . tilfy_tablo( 'icerik' ) . ' WHERE kapak_dosya_id = %d',
			$attachment_id
		)
	);
	if ( $kapak_kullanim > 0 ) {
		return true;
	}
	$icerik_ids = $wpdb->get_col(
		$wpdb->prepare(
			'SELECT id FROM ' . tilfy_tablo( 'icerik' ) . ' WHERE medya_dosya_id = %d',
			$attachment_id
		)
	);
	if ( empty( $icerik_ids ) ) {
		return false;
	}
	foreach ( array_map( 'intval', $icerik_ids ) as $icerik_id ) {
		if ( tilfy_kuyruk_icerik_medya_bekliyor_mu( $icerik_id ) ) {
			return true;
		}
		$bekleyen = (int) $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT(*) FROM " . tilfy_tablo( 'paylasim' ) . " WHERE icerik_id = %d AND durum IN ('beklemede','yukleniyor','zamanlandi')",
				$icerik_id
			)
		);
		if ( $bekleyen > 0 ) {
			return true;
		}
		$kuyruk_paylasim = $wpdb->get_results(
			"SELECT payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'paylasim_gonder' AND durum IN ('beklemede','calisiyor')"
		);
		foreach ( (array) $kuyruk_paylasim as $is ) {
			$payload = json_decode( (string) $is->payload, true );
			if ( is_array( $payload ) && (int) ( $payload['icerik_id'] ?? 0 ) === $icerik_id ) {
				return true;
			}
		}
	}
	return false;
}

function tilfy_medya_klasor_temizle( $tip ) {
	$tip = sanitize_key( (string) $tip );
	$map = array(
		'video'     => 'video',
		'image'     => 'image',
		'thumbnail' => 'thumbnail',
	);
	if ( ! isset( $map[ $tip ] ) ) {
		return array( 'ok' => false, 'mesaj' => 'Gecersiz klasor', 'silinen' => 0, 'atlanan' => 0 );
	}
	global $wpdb;
	$it       = tilfy_tablo( 'icerik' );
	$klasor   = tilfy_medya_alt_klasor_yolu( $map[ $tip ] );
	$silinen  = 0;
	$atlanan  = 0;
	$ids = $wpdb->get_col(
		"SELECT p.ID FROM {$wpdb->posts} p
		INNER JOIN {$wpdb->postmeta} pm ON pm.post_id = p.ID AND pm.meta_key = '_wp_attached_file'
		WHERE p.post_type = 'attachment' AND p.post_status IN ('inherit','private')"
	);
	foreach ( array_map( 'intval', (array) $ids ) as $attachment_id ) {
		$yol = get_attached_file( $attachment_id );
		if ( ! $yol || strpos( wp_normalize_path( $yol ), wp_normalize_path( $klasor ) ) !== 0 ) {
			continue;
		}
		if ( $tip === 'thumbnail' ) {
			if ( get_post_meta( $attachment_id, '_tilfy_kapak_kalici', true ) !== '1' ) {
				continue;
			}
		} elseif ( get_post_meta( $attachment_id, '_tilfy_gecici_medya', true ) !== '1' ) {
			++$atlanan;
			continue;
		}
		if ( tilfy_medya_silinemez_mi( $attachment_id ) ) {
			++$atlanan;
			continue;
		}
		if ( wp_delete_attachment( $attachment_id, true ) ) {
			++$silinen;
		}
	}
	return array(
		'ok'      => true,
		'silinen' => $silinen,
		'atlanan' => $atlanan,
		'boyut'   => function_exists( 'tilfy_medya_klasor_boyut' ) ? tilfy_medya_klasor_boyut( $map[ $tip ] ) : 0,
		'depo'    => $klasor,
	);
}

function tilfy_medya_onbellek_temizle() {
	global $wpdb;
	$ids = $wpdb->get_col(
		"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_tilfy_gecici_medya' AND meta_value = '1'"
	);
	$silinen = 0;
	$atlanan = 0;
	foreach ( array_map( 'intval', (array) $ids ) as $attachment_id ) {
		if ( tilfy_medya_silinemez_mi( $attachment_id ) ) {
			++$atlanan;
			continue;
		}
		if ( wp_delete_attachment( $attachment_id, true ) ) {
			++$silinen;
		}
	}
	$depo = tilfy_medya_depo_dizini();
	$boyut = function_exists( 'tilfy_medya_depo_boyut' ) ? tilfy_medya_depo_boyut() : 0;
	return array(
		'silinen' => $silinen,
		'atlanan' => $atlanan,
		'boyut'   => $boyut,
		'depo'    => $depo,
	);
}

function tilfy_medya_depo_boyut() {
	$depo = tilfy_medya_depo_dizini();
	if ( ! is_dir( $depo ) ) {
		return 0;
	}
	$toplam = 0;
	$iterator = new RecursiveIteratorIterator(
		new RecursiveDirectoryIterator( $depo, RecursiveDirectoryIterator::SKIP_DOTS )
	);
	foreach ( $iterator as $dosya ) {
		if ( $dosya->isFile() ) {
			$toplam += (int) $dosya->getSize();
		}
	}
	return $toplam;
}

function tilfy_kuyruk_adim_limiti() {
	return tilfy_ayar_al( 'kuyruk_tek_is', '1' ) === '1' ? 1 : 8;
}

function tilfy_surum_eslesiyor_mu() {
	$kod   = defined( 'TILFY_SURUM' ) ? TILFY_SURUM : '';
	$vt    = (string) get_option( 'tilfy_db_surum', '' );
	$baslik = '';
	if ( defined( 'TILFY_YOL' ) ) {
		$veri = get_file_data( TILFY_YOL . 'tilfy.php', array( 'Version' => 'Version' ) );
		$baslik = (string) ( $veri['Version'] ?? '' );
	}
	return $kod !== '' && $kod === $vt && ( $baslik === '' || $kod === $baslik );
}
