<?php

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

function tilfy_tiktok_api_aktif_mi() {
	return tilfy_ayar_al( 'tiktok_erisim_jetonu' ) !== '' && tilfy_ayar_al( 'tiktok_open_id' ) !== '';
}

function tilfy_tiktok_islem_log( $mesaj, $ekstra = array() ) {
	if ( ! function_exists( 'tilfy_islem_log' ) ) {
		return;
	}
	$ekstra['platform'] = 'tiktok';
	tilfy_islem_log( 'yukleme', $mesaj, $ekstra );
}

function tilfy_tiktok_son_jeton_hatasi() {
	return (string) ( $GLOBALS['tilfy_tiktok_jeton_hata'] ?? '' );
}

function tilfy_tiktok_jeton_yenileme_gerek( $mesaj ) {
	$mesaj = strtolower( (string) $mesaj );
	return strpos( $mesaj, 'access_token_invalid' ) !== false
		|| strpos( $mesaj, 'token expired' ) !== false
		|| strpos( $mesaj, 'invalid token' ) !== false;
}

function tilfy_tiktok_jeton_yenile() {
	$GLOBALS['tilfy_tiktok_jeton_hata'] = '';
	$yenileme = tilfy_ayar_al( 'tiktok_yenileme_jetonu' );
	$anahtar  = tilfy_ayar_al( 'tiktok_istemci_anahtar' );
	$gizli    = tilfy_ayar_al( 'tiktok_istemci_gizli' );
	if ( $yenileme === '' || $anahtar === '' || $gizli === '' ) {
		if ( $yenileme === '' ) {
			$GLOBALS['tilfy_tiktok_jeton_hata'] = 'TikTok yenileme jetonu yok';
		}
		return '';
	}
	$yanit = wp_remote_post(
		'https://open.tiktokapis.com/v2/oauth/token/',
		array(
			'timeout' => 30,
			'headers' => array(
				'Content-Type'  => 'application/x-www-form-urlencoded',
				'Cache-Control' => 'no-cache',
			),
			'body'    => array(
				'client_key'    => $anahtar,
				'client_secret' => $gizli,
				'grant_type'    => 'refresh_token',
				'refresh_token' => $yenileme,
			),
		)
	);
	if ( is_wp_error( $yanit ) ) {
		$GLOBALS['tilfy_tiktok_jeton_hata'] = $yanit->get_error_message();
		return '';
	}
	$govde = json_decode( wp_remote_retrieve_body( $yanit ), true );
	if ( empty( $govde['access_token'] ) ) {
		$hata = is_array( $govde ) ? (string) ( $govde['error_description'] ?? $govde['error'] ?? 'TikTok jeton yenilenemedi' ) : 'TikTok jeton yenilenemedi';
		$GLOBALS['tilfy_tiktok_jeton_hata'] = $hata;
		return '';
	}
	$kayit = array(
		'tiktok_erisim_jetonu' => sanitize_text_field( (string) $govde['access_token'] ),
		'tiktok_erisim_bitis'  => (string) tilfy_jeton_bitis_unix( $govde['expires_in'] ?? 86400, 86400 ),
	);
	if ( ! empty( $govde['refresh_token'] ) ) {
		$kayit['tiktok_yenileme_jetonu'] = sanitize_text_field( (string) $govde['refresh_token'] );
	}
	if ( ! empty( $govde['open_id'] ) ) {
		$kayit['tiktok_open_id'] = sanitize_text_field( (string) $govde['open_id'] );
	}
	tilfy_ayar_kaydet( $kayit );
	return $govde['access_token'];
}

function tilfy_tiktok_erisim_jetonu_al( $yenile = false ) {
	if ( $yenile || tilfy_jeton_suresi_doldu_mu( 'tiktok_erisim_bitis', 1800 ) ) {
		tilfy_ayar_kaydet(
			array(
				'tiktok_erisim_jetonu' => '',
				'tiktok_erisim_bitis'  => '',
			)
		);
		return tilfy_tiktok_jeton_yenile();
	}
	$jeton = tilfy_ayar_al( 'tiktok_erisim_jetonu' );
	if ( $jeton !== '' ) {
		return $jeton;
	}
	return tilfy_tiktok_jeton_yenile();
}

function tilfy_tiktok_yanit_isle( $govde ) {
	$parsed = is_array( $govde ) ? $govde : json_decode( (string) $govde, true );
	if ( ! is_array( $parsed ) ) {
		return new WP_Error( 'tilfy_tiktok', 'Gecersiz TikTok yaniti' );
	}
	$kod = (string) ( $parsed['error']['code'] ?? '' );
	if ( $kod !== '' && $kod !== 'ok' ) {
		$mesaj = (string) ( $parsed['error']['message'] ?? $kod );
		return new WP_Error( 'tilfy_tiktok', $mesaj !== '' ? $mesaj : $kod );
	}
	return $parsed['data'] ?? array();
}

function tilfy_tiktok_api_istek( $uc, $govde = null, $metot = 'POST', $tekrar = true ) {
	$jeton = tilfy_tiktok_erisim_jetonu_al();
	if ( $jeton === '' ) {
		$ek = tilfy_tiktok_son_jeton_hatasi();
		if ( $ek !== '' ) {
			return new WP_Error( 'tilfy_tiktok', $ek . ' - Ayarlar → TikTok ile yeniden baglanin.' );
		}
		return new WP_Error( 'tilfy_tiktok', 'TikTok jetonu eksik - Ayarlar → TikTok ile baglanin.' );
	}
	$url = 'https://open.tiktokapis.com/' . ltrim( $uc, '/' );
	$secenek = array(
		'timeout' => 120,
		'headers' => array(
			'Authorization' => 'Bearer ' . $jeton,
			'Content-Type'  => 'application/json; charset=UTF-8',
		),
	);
	if ( $metot === 'POST' ) {
		$secenek['body'] = $govde !== null ? wp_json_encode( $govde ) : '{}';
		$yanit           = wp_remote_post( $url, $secenek );
	} else {
		$yanit = wp_remote_get( $url, $secenek );
	}
	if ( is_wp_error( $yanit ) ) {
		return $yanit;
	}
	$sonuc = tilfy_tiktok_yanit_isle( wp_remote_retrieve_body( $yanit ) );
	if ( is_wp_error( $sonuc ) && $tekrar && tilfy_tiktok_jeton_yenileme_gerek( $sonuc->get_error_message() ) ) {
		tilfy_ayar_kaydet( array( 'tiktok_erisim_jetonu' => '', 'tiktok_erisim_bitis' => '' ) );
		$yeni = tilfy_tiktok_jeton_yenile();
		if ( $yeni === '' ) {
			$ek = tilfy_tiktok_son_jeton_hatasi();
			if ( $ek !== '' ) {
				return new WP_Error( 'tilfy_tiktok', $ek );
			}
			return $sonuc;
		}
		return tilfy_tiktok_api_istek( $uc, $govde, $metot, false );
	}
	return $sonuc;
}

function tilfy_tiktok_creator_info_al() {
	$veri = tilfy_tiktok_api_istek( 'v2/post/publish/creator_info/query/', new stdClass() );
	if ( is_wp_error( $veri ) ) {
		return $veri;
	}
	return is_array( $veri ) ? $veri : array();
}

function tilfy_tiktok_gizlilik_sec( $creator_info ) {
	$secenekler = array();
	if ( ! empty( $creator_info['privacy_level_options'] ) && is_array( $creator_info['privacy_level_options'] ) ) {
		$secenekler = array_map( 'strval', $creator_info['privacy_level_options'] );
	}
	$kayitli = strtoupper( sanitize_text_field( (string) tilfy_ayar_al( 'tiktok_gizlilik' ) ) );
	if ( $kayitli !== '' ) {
		foreach ( $secenekler as $sec ) {
			if ( strtoupper( (string) $sec ) === $kayitli ) {
				return (string) $sec;
			}
		}
	}
	$tercih = array( 'PUBLIC_TO_EVERYONE', 'MUTUAL_FOLLOW_FRIENDS', 'FOLLOWER_OF_CREATOR', 'SELF_ONLY' );
	foreach ( $tercih as $deger ) {
		if ( in_array( $deger, $secenekler, true ) ) {
			return $deger;
		}
	}
	return $secenekler[0] ?? 'SELF_ONLY';
}

function tilfy_tiktok_post_info_olustur( $creator_info, $baslik, $gizlilik ) {
	$duet    = ! empty( $creator_info['duet_disabled'] );
	$yorum   = ! empty( $creator_info['comment_disabled'] );
	$stitch  = ! empty( $creator_info['stitch_disabled'] );
	return array(
		'title'                    => $baslik,
		'privacy_level'            => $gizlilik,
		'disable_duet'             => $duet,
		'disable_comment'          => $yorum,
		'disable_stitch'           => $stitch,
		'video_cover_timestamp_ms' => 1000,
	);
}

function tilfy_tiktok_guidelines_hatasi_mi( $hata ) {
	if ( ! is_wp_error( $hata ) ) {
		return false;
	}
	$mesaj = strtolower( $hata->get_error_message() );
	return strpos( $mesaj, 'integration guidelines' ) !== false
		|| strpos( $mesaj, 'unaudited_client' ) !== false
		|| strpos( $mesaj, 'private accounts' ) !== false;
}

function tilfy_tiktok_baslik_olustur( $icerik, $paylasim ) {
	$parcalar = array();
	$baslik   = trim( (string) ( $paylasim->ozel_baslik ?? '' ) );
	if ( $baslik === '' ) {
		$baslik = trim( (string) ( $icerik->baslik ?? '' ) );
	}
	if ( $baslik !== '' ) {
		$parcalar[] = $baslik;
	}
	$aciklama = trim( (string) ( $paylasim->ozel_aciklama ?? '' ) );
	if ( $aciklama === '' ) {
		$aciklama = trim( (string) ( $icerik->aciklama ?? '' ) );
	}
	if ( $aciklama !== '' ) {
		$parcalar[] = $aciklama;
	}
	$etiketler = trim( (string) ( $paylasim->ozel_etiketler ?? '' ) );
	if ( $etiketler === '' ) {
		$etiketler = trim( (string) ( $icerik->etiketler ?? '' ) );
	}
	if ( $etiketler !== '' ) {
		$parcalar[] = $etiketler;
	}
	$metin = trim( implode( "\n\n", $parcalar ) );
	if ( $metin === '' ) {
		$metin = 'Tilfy ' . gmdate( 'Y-m-d H:i' );
	}
	if ( function_exists( 'mb_substr' ) ) {
		return mb_substr( $metin, 0, 2200 );
	}
	return substr( $metin, 0, 2200 );
}

function tilfy_tiktok_parca_bilgisi( $boyut ) {
	$boyut = max( 1, (int) $boyut );
	$min   = 5 * 1024 * 1024;
	$tek   = 64 * 1024 * 1024;
	if ( $boyut <= $tek ) {
		return array(
			'chunk_size'        => $boyut,
			'total_chunk_count' => 1,
		);
	}
	$chunk = 10 * 1000 * 1000;
	$say   = (int) floor( $boyut / $chunk );
	if ( $say < 2 ) {
		$chunk = (int) floor( $boyut / 2 );
		if ( $chunk < $min ) {
			$chunk = $min;
		}
		if ( $chunk > $tek ) {
			$chunk = $tek;
		}
		$say = (int) floor( $boyut / $chunk );
	}
	if ( $say > 1000 ) {
		$chunk = (int) ceil( $boyut / 1000 );
		if ( $chunk > $tek ) {
			$chunk = $tek;
		}
		$say = (int) floor( $boyut / $chunk );
	}
	if ( $say < 1 ) {
		$say = 1;
	}
	return array(
		'chunk_size'        => $chunk,
		'total_chunk_count' => $say,
	);
}

function tilfy_tiktok_dosya_yukle( $upload_url, $dosya_yolu, $chunk_size, $total_chunk_count, $log_ekstra = array(), $mime = 'video/mp4' ) {
	$upload_url = (string) $upload_url;
	if ( $upload_url === '' || ! is_readable( $dosya_yolu ) ) {
		return new WP_Error( 'tilfy_tiktok', 'TikTok yukleme URL veya dosya gecersiz' );
	}
	$boyut = (int) filesize( $dosya_yolu );
	if ( $boyut <= 0 ) {
		return new WP_Error( 'tilfy_tiktok', 'Video dosya boyutu okunamadi' );
	}
	$chunk_size = max( 1, (int) $chunk_size );
	$toplam     = max( 1, (int) $total_chunk_count );
	$handle     = fopen( $dosya_yolu, 'rb' );
	if ( ! $handle ) {
		return new WP_Error( 'tilfy_tiktok', 'Video dosyasi acilamadi' );
	}
	for ( $i = 0; $i < $toplam; $i++ ) {
		$bas = $i * $chunk_size;
		$son = ( $i === $toplam - 1 ) ? ( $boyut - 1 ) : ( $bas + $chunk_size - 1 );
		if ( $son < $bas ) {
			fclose( $handle );
			return new WP_Error( 'tilfy_tiktok', 'TikTok parca araligi gecersiz' );
		}
		$uzun = $son - $bas + 1;
		if ( $bas > 0 ) {
			fseek( $handle, $bas );
		}
		$veri = fread( $handle, $uzun );
		if ( $veri === false || strlen( $veri ) !== $uzun ) {
			fclose( $handle );
			return new WP_Error( 'tilfy_tiktok', 'Video parcasi okunamadi' );
		}
		tilfy_tiktok_islem_log( 'Parca yukleniyor ' . ( $i + 1 ) . '/' . $toplam . ' (' . $uzun . ' bayt)', $log_ekstra );
		$yanit = wp_remote_request(
			$upload_url,
			array(
				'method'  => 'PUT',
				'timeout' => 600,
				'headers' => array(
					'Content-Type'   => $mime !== '' ? $mime : 'video/mp4',
					'Content-Length' => (string) $uzun,
					'Content-Range'  => 'bytes ' . $bas . '-' . $son . '/' . $boyut,
				),
				'body'    => $veri,
			)
		);
		if ( is_wp_error( $yanit ) ) {
			fclose( $handle );
			return $yanit;
		}
		$kod = (int) wp_remote_retrieve_response_code( $yanit );
		if ( $kod < 200 || $kod >= 300 ) {
			fclose( $handle );
			$govde = wp_remote_retrieve_body( $yanit );
			return new WP_Error( 'tilfy_tiktok', 'TikTok dosya yukleme HTTP ' . $kod . ( $govde !== '' ? ': ' . wp_trim_words( $govde, 20, '…' ) : '' ) );
		}
	}
	fclose( $handle );
	return true;
}

function tilfy_tiktok_yayin_durumu_bekle( $publish_id, $creator_username = '', $log_ekstra = array(), $max_saniye = 180 ) {
	$publish_id = sanitize_text_field( (string) $publish_id );
	if ( $publish_id === '' ) {
		return new WP_Error( 'tilfy_tiktok', 'publish_id eksik' );
	}
	$bitis = time() + max( 30, (int) $max_saniye );
	while ( time() < $bitis ) {
		$durum = tilfy_tiktok_api_istek(
			'v2/post/publish/status/fetch/',
			array( 'publish_id' => $publish_id )
		);
		if ( is_wp_error( $durum ) ) {
			return $durum;
		}
		$st = (string) ( $durum['status'] ?? '' );
		tilfy_tiktok_islem_log( 'Yayin durumu: ' . ( $st !== '' ? $st : 'bekleniyor' ), $log_ekstra );
		if ( $st === 'PUBLISH_COMPLETE' ) {
			$post_ids = array();
			if ( ! empty( $durum['publicaly_available_post_id'] ) && is_array( $durum['publicaly_available_post_id'] ) ) {
				$post_ids = array_map( 'strval', $durum['publicaly_available_post_id'] );
			}
			$post_id = $post_ids[0] ?? '';
			$url     = '';
			if ( $post_id !== '' && $creator_username !== '' ) {
				$url = 'https://www.tiktok.com/@' . rawurlencode( $creator_username ) . '/video/' . rawurlencode( $post_id );
			} elseif ( $creator_username !== '' ) {
				$url = 'https://www.tiktok.com/@' . rawurlencode( $creator_username );
			}
			return array(
				'post_id' => $post_id,
				'url'     => $url,
				'status'  => $st,
			);
		}
		if ( $st === 'FAILED' ) {
			$neden = (string) ( $durum['fail_reason'] ?? 'TikTok yayin basarisiz' );
			return new WP_Error( 'tilfy_tiktok', $neden );
		}
		if ( $st === 'SEND_TO_USER_INBOX' ) {
			return array(
				'post_id' => '',
				'url'     => 'https://www.tiktok.com/upload',
				'status'  => $st,
				'mesaj'   => 'TikTok gelen kutusuna gonderildi; uygulamadan onaylayin',
			);
		}
		sleep( 6 );
	}
	return new WP_Error( 'tilfy_tiktok', 'TikTok yayin durumu zaman asimi' );
}

function tilfy_tiktok_video_init( $post_info, $source_info, $direct = true ) {
	$uc    = $direct ? 'v2/post/publish/video/init/' : 'v2/post/publish/inbox/video/init/';
	$govde = array( 'source_info' => $source_info );
	if ( $direct && is_array( $post_info ) ) {
		$govde['post_info'] = $post_info;
	}
	return tilfy_tiktok_api_istek( $uc, $govde );
}

function tilfy_tiktok_paylasim_gonder( $icerik, $paylasim ) {
	if ( ! tilfy_tiktok_api_aktif_mi() ) {
		return array( 'ok' => false, 'mesaj' => 'TikTok OAuth gerekli' );
	}
	$log_ekstra = array(
		'paylasim_id' => (int) ( $paylasim->id ?? 0 ),
		'icerik_id'   => (int) ( $icerik->id ?? 0 ),
	);
	if ( ! function_exists( 'tilfy_icerik_medya_hazirla' ) ) {
		return array( 'ok' => false, 'mesaj' => 'Medya modulu yok' );
	}
	$medya = tilfy_icerik_medya_hazirla( $icerik );
	if ( is_wp_error( $medya ) ) {
		return array( 'ok' => false, 'mesaj' => $medya->get_error_message() );
	}
	if ( function_exists( 'tilfy_medya_tipi_belirle' ) && tilfy_medya_tipi_belirle( (int) $medya['dosya_id'] ) !== 'video' ) {
		return array( 'ok' => false, 'mesaj' => 'TikTok yalnizca video kabul eder' );
	}
	$dosya_yolu = get_attached_file( (int) $medya['dosya_id'] );
	if ( ! $dosya_yolu || ! is_readable( $dosya_yolu ) ) {
		return array( 'ok' => false, 'mesaj' => 'Video dosyasi okunamadi' );
	}
	$boyut = (int) filesize( $dosya_yolu );
	if ( $boyut <= 0 ) {
		return array( 'ok' => false, 'mesaj' => 'Video dosya boyutu gecersiz' );
	}

	$creator = tilfy_tiktok_creator_info_al();
	if ( is_wp_error( $creator ) ) {
		return array( 'ok' => false, 'mesaj' => $creator->get_error_message() );
	}
	$username = sanitize_text_field( (string) ( $creator['creator_username'] ?? '' ) );
	$gizlilik = tilfy_tiktok_gizlilik_sec( $creator );
	$baslik   = tilfy_tiktok_baslik_olustur( $icerik, $paylasim );
	$parca    = tilfy_tiktok_parca_bilgisi( $boyut );
	$source_info = array(
		'source'            => 'FILE_UPLOAD',
		'video_size'        => $boyut,
		'chunk_size'        => $parca['chunk_size'],
		'total_chunk_count' => $parca['total_chunk_count'],
	);

	$direct_tercih = tilfy_ayar_al( 'tiktok_direct_post', '1' ) !== '0';
	$post_info     = tilfy_tiktok_post_info_olustur( $creator, $baslik, $gizlilik );
	$init          = null;
	$direct        = false;

	tilfy_tiktok_islem_log(
		'Direct post init boyut=' . $boyut . ' chunk=' . $parca['chunk_size'] . ' parca=' . $parca['total_chunk_count'] . ' gizlilik=' . $gizlilik,
		$log_ekstra
	);
	$direct_init = tilfy_tiktok_video_init( $post_info, $source_info, true );
	if ( ! is_wp_error( $direct_init ) ) {
		$init   = $direct_init;
		$direct = true;
	} elseif ( ! $direct_tercih ) {
		tilfy_tiktok_islem_log(
			'Direct post olmadi (' . $direct_init->get_error_message() . '), inbox upload deneniyor',
			$log_ekstra
		);
		$init   = tilfy_tiktok_video_init( null, $source_info, false );
		$direct = false;
	} else {
		$init = $direct_init;
	}
	if ( is_wp_error( $init ) ) {
		return array( 'ok' => false, 'mesaj' => $init->get_error_message() );
	}

	$publish_id = sanitize_text_field( (string) ( $init['publish_id'] ?? '' ) );
	$upload_url = (string) ( $init['upload_url'] ?? '' );
	if ( $publish_id === '' || $upload_url === '' ) {
		return array( 'ok' => false, 'mesaj' => 'TikTok init yaniti eksik' );
	}

	$yukle = tilfy_tiktok_dosya_yukle(
		$upload_url,
		$dosya_yolu,
		(int) $parca['chunk_size'],
		(int) $parca['total_chunk_count'],
		$log_ekstra,
		(string) ( wp_check_filetype( $dosya_yolu )['type'] ?? 'video/mp4' )
	);
	if ( is_wp_error( $yukle ) ) {
		return array( 'ok' => false, 'mesaj' => $yukle->get_error_message() );
	}

	tilfy_tiktok_islem_log( 'Dosya yuklendi, durum bekleniyor publish_id=' . $publish_id, $log_ekstra );
	$sonuc = tilfy_tiktok_yayin_durumu_bekle( $publish_id, $username, $log_ekstra );
	if ( is_wp_error( $sonuc ) ) {
		return array( 'ok' => false, 'mesaj' => $sonuc->get_error_message() );
	}

	$post_id = (string) ( $sonuc['post_id'] ?? '' );
	$url     = (string) ( $sonuc['url'] ?? '' );
	if ( $url === '' ) {
		$url = 'https://www.tiktok.com/upload';
	}
	$mesaj = (string) ( $sonuc['mesaj'] ?? '' );
	if ( $mesaj === '' ) {
		$mesaj = $direct ? 'TikTok yayinlandi' : 'TikTok gelen kutusuna gonderildi';
	}
	tilfy_tiktok_islem_log( $mesaj . ( $post_id !== '' ? ' post_id=' . $post_id : '' ), $log_ekstra );

	$sonuc_dizi = array(
		'ok'        => true,
		'hedef_id'  => $post_id !== '' ? $post_id : $publish_id,
		'hedef_url' => $url,
		'mesaj'     => $mesaj,
	);
	if ( ! $direct || (string) ( $sonuc['status'] ?? '' ) === 'SEND_TO_USER_INBOX' ) {
		$sonuc_dizi['inbox_modu']   = true;
		$sonuc_dizi['baslik_kopya'] = $baslik;
	}
	return $sonuc_dizi;
}

function tilfy_tiktok_profil_dogrula() {
	$creator = tilfy_tiktok_creator_info_al();
	if ( is_wp_error( $creator ) ) {
		return $creator;
	}
	if ( empty( $creator['creator_username'] ) && empty( $creator['creator_nickname'] ) ) {
		return new WP_Error( 'tilfy_tiktok', 'TikTok creator bilgisi alinamadi' );
	}
	return $creator;
}
