<?php

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

function tilfy_icerik_meta_uzaktan_medya_mi( $icerik ) {
	if ( ! $icerik ) {
		return false;
	}
	$platform  = sanitize_key( (string) ( $icerik->kaynak_platform ?? '' ) );
	$kaynak_id = sanitize_text_field( (string) ( $icerik->kaynak_id ?? '' ) );
	return $kaynak_id !== '' && in_array( $platform, array( 'instagram', 'facebook' ), true );
}

function tilfy_icerik_video_icin_gorsel_dosya_mi( $icerik, $dosya_id = 0 ) {
	if ( ! $icerik ) {
		return false;
	}
	$tip = (string) ( $icerik->medya_tipi ?? '' );
	if ( function_exists( 'tilfy_icerik_medya_grup' ) && tilfy_icerik_medya_grup( $tip ) !== 'video' ) {
		return false;
	}
	$dosya_id = (int) $dosya_id;
	if ( $dosya_id <= 0 ) {
		$dosya_id = (int) ( $icerik->medya_dosya_id ?? 0 );
	}
	if ( $dosya_id <= 0 || ! function_exists( 'tilfy_medya_tipi_belirle' ) ) {
		return false;
	}
	return tilfy_medya_tipi_belirle( $dosya_id ) === 'image';
}

function tilfy_icerik_uzaktan_medya_gerekli_mi( $icerik ) {
	if ( ! $icerik ) {
		return false;
	}
	$dosya_id = (int) ( $icerik->medya_dosya_id ?? 0 );
	if ( $dosya_id > 0 ) {
		if ( tilfy_icerik_video_icin_gorsel_dosya_mi( $icerik, $dosya_id ) ) {
			return true;
		}
		if ( function_exists( 'tilfy_medya_dosya_gecerli_mi' ) && tilfy_medya_dosya_gecerli_mi( $dosya_id ) ) {
			return false;
		}
		if ( ! function_exists( 'tilfy_medya_dosya_gecerli_mi' ) && wp_get_attachment_url( $dosya_id ) ) {
			return false;
		}
	}
	if ( tilfy_icerik_meta_uzaktan_medya_mi( $icerik ) ) {
		return true;
	}
	$medya = trim( (string) ( $icerik->medya_url ?? '' ) );
	$kapak = trim( (string) ( $icerik->kapak_url ?? '' ) );
	if ( function_exists( 'tilfy_icerik_url_gecerli_mi' ) ) {
		return tilfy_icerik_url_gecerli_mi( $medya ) || tilfy_icerik_url_gecerli_mi( $kapak );
	}
	return $medya !== '' || $kapak !== '';
}

function tilfy_icerik_son_api_medya_url_kaydet( $icerik_id, $url ) {
	$icerik_id = (int) $icerik_id;
	$url      = esc_url_raw( (string) $url );
	if ( $icerik_id <= 0 || $url === '' ) {
		return;
	}
	set_transient( 'tilfy_api_medya_' . $icerik_id, $url, HOUR_IN_SECONDS );
}

function tilfy_icerik_son_api_medya_url_al( $icerik_id ) {
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return '';
	}
	$url = get_transient( 'tilfy_api_medya_' . $icerik_id );
	return is_string( $url ) ? esc_url_raw( $url ) : '';
}

function tilfy_icerik_son_api_medya_url_sil( $icerik_id ) {
	delete_transient( 'tilfy_api_medya_' . (int) $icerik_id );
}

function tilfy_kuyruk_icerik_indirme_url_al( $icerik_id ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	if ( $icerik_id <= 0 ) {
		return '';
	}
	$satirlar = $wpdb->get_results(
		"SELECT payload FROM " . tilfy_tablo( 'kuyruk' ) . " WHERE islem = 'medya_indir' AND durum IN ('beklemede','calisiyor') ORDER BY id DESC"
	);
	foreach ( (array) $satirlar as $satir ) {
		$payload = json_decode( (string) $satir->payload, true );
		if ( ! is_array( $payload ) || (int) ( $payload['icerik_id'] ?? 0 ) !== $icerik_id ) {
			continue;
		}
		$url = esc_url_raw( (string) ( $payload['indirme_url'] ?? '' ) );
		if ( $url !== '' ) {
			return $url;
		}
	}
	return '';
}

function tilfy_kuyruk_icerik_indirme_url_kaydet( $icerik_id, $url ) {
	global $wpdb;
	$icerik_id = (int) $icerik_id;
	$url       = esc_url_raw( (string) $url );
	if ( $icerik_id <= 0 || $url === '' ) {
		return;
	}
	tilfy_icerik_son_api_medya_url_kaydet( $icerik_id, $url );
	$satirlar = $wpdb->get_results(
		"SELECT id, 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 ) {
			continue;
		}
		$payload['indirme_url'] = $url;
		$wpdb->update(
			tilfy_tablo( 'kuyruk' ),
			array( 'payload' => wp_json_encode( $payload ) ),
			array( 'id' => (int) $satir->id )
		);
	}
}

function tilfy_icerik_medya_hazirla( $icerik ) {
	if ( ! $icerik ) {
		return new WP_Error( 'tilfy_medya', 'İçerik yok' );
	}
	if ( (int) $icerik->medya_dosya_id > 0 ) {
		$dosya_id = (int) $icerik->medya_dosya_id;
		$gecerli  = function_exists( 'tilfy_medya_dosya_gecerli_mi' ) ? tilfy_medya_dosya_gecerli_mi( $dosya_id ) : (bool) get_attached_file( $dosya_id );
		$url      = $gecerli ? wp_get_attachment_url( $dosya_id ) : '';
		if ( $url && ! tilfy_icerik_video_icin_gorsel_dosya_mi( $icerik, $dosya_id ) ) {
			return array(
				'dosya_id' => $dosya_id,
				'url'      => $url,
			);
		}
		global $wpdb;
		$wpdb->update(
			tilfy_tablo( 'icerik' ),
			array(
				'medya_dosya_id' => 0,
				'guncelleme'     => current_time( 'mysql' ),
			),
			array( 'id' => (int) $icerik->id )
		);
		$icerik->medya_dosya_id = 0;
	}
	if ( sanitize_key( (string) ( $icerik->kaynak_platform ?? '' ) ) === 'wordpress' && function_exists( 'tilfy_wordpress_icerik_canli_yenile' ) ) {
		$icerik = tilfy_wordpress_icerik_canli_yenile( $icerik );
	}
	if ( function_exists( 'tilfy_icerik_paylasim_medya_eksik_mi' ) && tilfy_icerik_paylasim_medya_eksik_mi( $icerik ) ) {
		$mesaj = function_exists( 'tilfy_kapak_eksik_hata_mesaji' ) ? tilfy_kapak_eksik_hata_mesaji() : 'Kapak yok';
		return new WP_Error( 'tilfy_kapak_eksik', $mesaj );
	}
	$video_mu = ! function_exists( 'tilfy_icerik_medya_grup' ) || tilfy_icerik_medya_grup( (string) ( $icerik->medya_tipi ?? '' ) ) === 'video';
	if ( ! $video_mu ) {
		if (
			( ! function_exists( 'tilfy_icerik_url_gecerli_mi' ) || ! tilfy_icerik_url_gecerli_mi( (string) ( $icerik->medya_url ?? '' ) ) )
			&& function_exists( 'tilfy_icerik_url_gecerli_mi' )
			&& tilfy_icerik_url_gecerli_mi( (string) ( $icerik->kapak_url ?? '' ) )
		) {
			$icerik->medya_url = (string) $icerik->kapak_url;
		} elseif ( trim( (string) ( $icerik->medya_url ?? '' ) ) === '' && trim( (string) ( $icerik->kapak_url ?? '' ) ) !== '' && strpos( (string) $icerik->kapak_url, 'tilfy://' ) !== 0 ) {
			$icerik->medya_url = (string) $icerik->kapak_url;
		}
	}
	$icerik = tilfy_icerik_medya_url_indirme_oncesi_yenile( $icerik );
	if ( is_wp_error( $icerik ) ) {
		return $icerik;
	}
	$medya_url = (string) $icerik->medya_url;
	if ( function_exists( 'tilfy_icerik_url_gecerli_mi' ) && ! tilfy_icerik_url_gecerli_mi( $medya_url ) ) {
		$medya_url = '';
	}
	if ( $medya_url === '' ) {
		return new WP_Error( 'tilfy_medya', 'Medya URL yok' );
	}
	if ( ! tilfy_url_izinli_mi( $medya_url ) ) {
		return new WP_Error( 'tilfy_medya', 'Medya host izinli degil' );
	}
	$dosya_id = tilfy_uzaktan_medya_indir( $medya_url, (int) $icerik->id, true );
	if ( is_wp_error( $dosya_id ) ) {
		return $dosya_id;
	}
	if ( tilfy_icerik_video_icin_gorsel_dosya_mi( $icerik, (int) $dosya_id ) ) {
		if ( function_exists( 'wp_delete_attachment' ) ) {
			wp_delete_attachment( (int) $dosya_id, true );
		}
		return new WP_Error( 'tilfy_medya', 'Video beklenirken gorsel indirildi; Instagram video URL yenilenemedi' );
	}
	global $wpdb;
	$wpdb->update(
		tilfy_tablo( 'icerik' ),
		array(
			'medya_dosya_id' => (int) $dosya_id,
			'guncelleme'     => current_time( 'mysql' ),
		),
		array( 'id' => (int) $icerik->id )
	);
	return array(
		'dosya_id' => (int) $dosya_id,
		'url'      => wp_get_attachment_url( (int) $dosya_id ),
	);
}

function tilfy_cdn_indirme_istek_args( $args, $url ) {
	if ( empty( $GLOBALS['tilfy_medya_indiriyor'] ) ) {
		return $args;
	}
	$url = (string) $url;
	if ( strpos( $url, 'cdninstagram.com' ) === false && strpos( $url, 'fbcdn.net' ) === false ) {
		return $args;
	}
	$args['redirection'] = 5;
	if ( ! isset( $args['headers'] ) || ! is_array( $args['headers'] ) ) {
		$args['headers'] = array();
	}
	$args['headers']['Referer'] = 'https://www.instagram.com/';
	$args['headers']['Accept']  = '*/*';
	return $args;
}

function tilfy_uzaktan_medya_indir( $url, $icerik_id = 0, $gecici = false ) {
	require_once ABSPATH . 'wp-admin/includes/file.php';
	require_once ABSPATH . 'wp-admin/includes/image.php';

	if ( ! tilfy_url_izinli_mi( $url ) ) {
		return new WP_Error( 'tilfy_medya', 'URL reddedildi' );
	}

	$GLOBALS['tilfy_medya_indiriyor'] = true;
	$uzanti = strtolower( ltrim( tilfy_uzanti_tahmin( $url ), '.' ) );
	$GLOBALS['tilfy_medya_klasor_tipi'] = in_array( $uzanti, array( 'jpg', 'jpeg', 'png', 'webp' ), true ) ? 'image' : 'video';
	add_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
	add_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10, 2 );

	$tmp = download_url( $url, 300 );
	if ( is_wp_error( $tmp ) ) {
		remove_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10 );
		remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
		unset( $GLOBALS['tilfy_medya_indiriyor'], $GLOBALS['tilfy_medya_klasor_tipi'] );
		return $tmp;
	}

	$max_byte = 200 * 1024 * 1024;
	$boyut    = @filesize( $tmp );
	if ( is_int( $boyut ) && $boyut > $max_byte ) {
		@unlink( $tmp );
		remove_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10 );
		remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
		unset( $GLOBALS['tilfy_medya_indiriyor'], $GLOBALS['tilfy_medya_klasor_tipi'] );
		return new WP_Error( 'tilfy_medya', 'Medya dosyasi cok buyuk' );
	}

	$mime = '';
	if ( function_exists( 'mime_content_type' ) ) {
		$mime = (string) @mime_content_type( $tmp );
	}
	$uzanti_tam = tilfy_uzanti_tahmin( $url, $mime );
	$uzanti     = strtolower( ltrim( $uzanti_tam, '.' ) );
	$GLOBALS['tilfy_medya_klasor_tipi'] = in_array( $uzanti, array( 'jpg', 'jpeg', 'png', 'webp' ), true ) ? 'image' : 'video';

	$dosya_adi = 'tilfy-' . (int) $icerik_id . '-' . wp_generate_password( 8, false ) . $uzanti_tam;
	$dosya     = array(
		'name'     => sanitize_file_name( $dosya_adi ),
		'tmp_name' => $tmp,
	);

	$sonuc = wp_handle_sideload(
		$dosya,
		array(
			'test_form' => false,
			'mimes'     => array(
				'mp4'  => 'video/mp4',
				'mov'  => 'video/quicktime',
				'jpg'  => 'image/jpeg',
				'jpeg' => 'image/jpeg',
				'png'  => 'image/png',
				'webp' => 'image/webp',
			),
		)
	);

	if ( isset( $sonuc['error'] ) ) {
		@unlink( $tmp );
		remove_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10 );
		remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
		unset( $GLOBALS['tilfy_medya_indiriyor'], $GLOBALS['tilfy_medya_klasor_tipi'] );
		return new WP_Error( 'tilfy_medya', $sonuc['error'] );
	}

	$ek_id = wp_insert_attachment(
		array(
			'post_mime_type' => $sonuc['type'],
			'post_title'     => 'Tilfy ' . (int) $icerik_id,
			'post_content'   => '',
			'post_status'    => 'inherit',
		),
		$sonuc['file']
	);

	if ( is_wp_error( $ek_id ) || ! $ek_id ) {
		remove_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10 );
		remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
		unset( $GLOBALS['tilfy_medya_indiriyor'], $GLOBALS['tilfy_medya_klasor_tipi'] );
		return new WP_Error( 'tilfy_medya', 'Ek yuklenemedi' );
	}

	if ( strpos( $sonuc['type'], 'image/' ) === 0 ) {
		if ( ! function_exists( 'wp_generate_attachment_metadata' ) ) {
			require_once ABSPATH . 'wp-admin/includes/image.php';
		}
		wp_update_attachment_metadata( $ek_id, wp_generate_attachment_metadata( $ek_id, $sonuc['file'] ) );
	}

	remove_filter( 'http_request_args', 'tilfy_cdn_indirme_istek_args', 10 );
	remove_filter( 'upload_dir', 'tilfy_medya_upload_dir_filtresi' );
	unset( $GLOBALS['tilfy_medya_indiriyor'], $GLOBALS['tilfy_medya_klasor_tipi'] );

	if ( $gecici && function_exists( 'tilfy_medya_gecici_isaretle' ) ) {
		tilfy_medya_gecici_isaretle( (int) $ek_id );
	}

	if ( function_exists( 'tilfy_icerik_kapak_sunucuya_kaydet_dene' ) ) {
		tilfy_icerik_kapak_sunucuya_kaydet_dene( (int) $icerik_id );
	}

	return (int) $ek_id;
}

function tilfy_uzanti_tahmin( $url, $mime = '' ) {
	$path = wp_parse_url( $url, PHP_URL_PATH );
	if ( is_string( $path ) && preg_match( '/\.(mp4|mov|jpg|jpeg|png|webp)$/i', $path, $m ) ) {
		return '.' . strtolower( $m[1] );
	}
	$mime = strtolower( trim( (string) $mime ) );
	$map  = array(
		'image/jpeg'      => '.jpg',
		'image/jpg'       => '.jpg',
		'image/png'       => '.png',
		'image/webp'      => '.webp',
		'video/mp4'       => '.mp4',
		'video/quicktime' => '.mov',
	);
	if ( isset( $map[ $mime ] ) ) {
		return $map[ $mime ];
	}
	if ( strpos( $mime, 'image/' ) === 0 ) {
		return '.jpg';
	}
	return '.mp4';
}

function tilfy_medya_tipi_belirle( $dosya_id ) {
	$dosya_id = (int) $dosya_id;
	if ( $dosya_id <= 0 ) {
		return 'video';
	}
	$mime = get_post_mime_type( $dosya_id );
	if ( is_string( $mime ) && strpos( $mime, 'image/' ) === 0 ) {
		return 'image';
	}
	return 'video';
}

function tilfy_medya_herkese_acik_url( $dosya_id ) {
	$url = wp_get_attachment_url( (int) $dosya_id );
	if ( ! $url ) {
		return '';
	}
	return $url;
}

function tilfy_icerik_medya_url_indirme_oncesi_yenile( $icerik ) {
	if ( ! $icerik ) {
		return new WP_Error( 'tilfy_medya', 'İçerik yok' );
	}
	$platform  = sanitize_key( (string) ( $icerik->kaynak_platform ?? '' ) );
	$kaynak_id = sanitize_text_field( (string) ( $icerik->kaynak_id ?? '' ) );
	if ( $platform === 'wordpress' ) {
		if ( function_exists( 'tilfy_wordpress_icerik_canli_yenile' ) ) {
			$icerik = tilfy_wordpress_icerik_canli_yenile( $icerik );
		}
		return $icerik;
	}
	if ( $kaynak_id === '' || ! in_array( $platform, array( 'instagram', 'facebook' ), true ) ) {
		return $icerik;
	}
	if ( function_exists( 'tilfy_api_dosyalari_yukle' ) ) {
		tilfy_api_dosyalari_yukle();
	}
	if ( tilfy_icerik_meta_uzaktan_medya_mi( $icerik ) ) {
		global $wpdb;
		$wpdb->update(
			tilfy_tablo( 'icerik' ),
			array(
				'medya_url'  => '',
				'guncelleme' => current_time( 'mysql' ),
			),
			array( 'id' => (int) $icerik->id )
		);
		$icerik->medya_url = '';
	}
	$yenilen_url = false;
	if ( $platform === 'instagram' && function_exists( 'tilfy_meta_instagram_medya_url_yenile' ) ) {
		$yenilen_url = tilfy_meta_instagram_medya_url_yenile( $icerik );
	} elseif ( $platform === 'facebook' && function_exists( 'tilfy_meta_facebook_medya_url_yenile' ) ) {
		$yenilen_url = tilfy_meta_facebook_medya_url_yenile( $icerik );
	}
	if ( ! is_string( $yenilen_url ) || $yenilen_url === '' ) {
		return new WP_Error( 'tilfy_medya', 'Medya URL API ile guncellenemedi' );
	}
	$icerik->medya_url = $yenilen_url;
	if ( function_exists( 'tilfy_kuyruk_icerik_indirme_url_kaydet' ) ) {
		tilfy_kuyruk_icerik_indirme_url_kaydet( (int) ( $icerik->id ?? 0 ), $yenilen_url );
	} elseif ( function_exists( 'tilfy_icerik_son_api_medya_url_kaydet' ) ) {
		tilfy_icerik_son_api_medya_url_kaydet( (int) ( $icerik->id ?? 0 ), $yenilen_url );
	}
	return $icerik;
}
