<?php

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

function tilfy_linkedin_jeton() {
	return tilfy_ayar_al( 'linkedin_erisim_jetonu' );
}

function tilfy_linkedin_ugc_basliklar( $jeton ) {
	return array(
		'Authorization'             => 'Bearer ' . $jeton,
		'Content-Type'              => 'application/json',
		'X-Restli-Protocol-Version' => '2.0.0',
	);
}

function tilfy_linkedin_hata_mesaji( $yanit, $kod ) {
	$mesaj = 'LinkedIn HTTP ' . $kod;
	$govde = json_decode( wp_remote_retrieve_body( $yanit ), true );
	if ( is_array( $govde ) ) {
		if ( ! empty( $govde['message'] ) ) {
			$mesaj .= ': ' . (string) $govde['message'];
		} elseif ( ! empty( $govde['error_description'] ) ) {
			$mesaj .= ': ' . (string) $govde['error_description'];
		} elseif ( ! empty( $govde['error'] ) ) {
			$mesaj .= ': ' . (string) $govde['error'];
		}
		if ( ! empty( $govde['code'] ) ) {
			$mesaj .= ' [' . (string) $govde['code'] . ']';
		}
	}
	if ( (int) $kod === 403 ) {
		$mesaj .= ' - Jetonu yenileyin (LinkedIn ile baglan). w_member_social izni ve Share on LinkedIn urunu gerekli.';
	}
	return $mesaj;
}

function tilfy_linkedin_uye_id_al( $jeton = '' ) {
	if ( $jeton === '' ) {
		$jeton = tilfy_linkedin_jeton();
	}
	$uye = tilfy_ayar_al( 'linkedin_uye_id' );
	if ( $uye !== '' ) {
		return $uye;
	}
	if ( $jeton === '' || ! function_exists( 'tilfy_linkedin_userinfo_al' ) ) {
		return '';
	}
	$profil = tilfy_linkedin_userinfo_al( $jeton );
	if ( is_wp_error( $profil ) || empty( $profil['sub'] ) ) {
		return '';
	}
	$kayit = array( 'linkedin_uye_id' => sanitize_text_field( (string) $profil['sub'] ) );
	if ( ! empty( $profil['name'] ) ) {
		$kayit['linkedin_profil_adi'] = sanitize_text_field( (string) $profil['name'] );
	}
	tilfy_ayar_kaydet( $kayit );
	return $kayit['linkedin_uye_id'];
}

function tilfy_linkedin_yazar_urn( $jeton ) {
	$uye = tilfy_linkedin_uye_id_al( $jeton );
	if ( $uye === '' ) {
		return '';
	}
	return 'urn:li:person:' . sanitize_text_field( $uye );
}

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

function tilfy_linkedin_dosya_yukle( $upload_url, $dosya_yolu, $jeton, $mime ) {
	$upload_url = (string) $upload_url;
	if ( $upload_url === '' || ! is_readable( $dosya_yolu ) ) {
		return new WP_Error( 'tilfy_linkedin', 'Medya dosyasi okunamadi' );
	}
	$boyut = (int) filesize( $dosya_yolu );
	if ( $boyut <= 0 ) {
		return new WP_Error( 'tilfy_linkedin', 'Medya dosya boyutu okunamadi' );
	}
	$govde = file_get_contents( $dosya_yolu );
	if ( false === $govde ) {
		return new WP_Error( 'tilfy_linkedin', 'Medya dosyasi acilamadi' );
	}
	return wp_remote_request(
		$upload_url,
		array(
			'method'  => 'PUT',
			'timeout' => 600,
			'headers' => array(
				'Authorization'  => 'Bearer ' . $jeton,
				'Content-Type'   => $mime,
				'Content-Length' => (string) $boyut,
			),
			'body'    => $govde,
		)
	);
}

function tilfy_linkedin_asset_yukle( $jeton, $yazar, $dosya_yolu, $tur ) {
	if ( ! is_readable( $dosya_yolu ) ) {
		return new WP_Error( 'tilfy_linkedin', 'Medya dosyasi okunamadi' );
	}
	$recipe = $tur === 'video'
		? 'urn:li:digitalmediaRecipe:feedshare-video'
		: 'urn:li:digitalmediaRecipe:feedshare-image';
	$kayit = wp_remote_post(
		'https://api.linkedin.com/v2/assets?action=registerUpload',
		array(
			'timeout' => 60,
			'headers' => tilfy_linkedin_ugc_basliklar( $jeton ),
			'body'    => wp_json_encode(
				array(
					'registerUploadRequest' => array(
						'recipes'              => array( $recipe ),
						'owner'                => $yazar,
						'serviceRelationships' => array(
							array(
								'relationshipType' => 'OWNER',
								'identifier'       => 'urn:li:userGeneratedContent',
							),
						),
					),
				)
			),
		)
	);
	if ( is_wp_error( $kayit ) ) {
		return $kayit;
	}
	$kod = (int) wp_remote_retrieve_response_code( $kayit );
	if ( $kod < 200 || $kod >= 300 ) {
		return new WP_Error( 'tilfy_linkedin', tilfy_linkedin_hata_mesaji( $kayit, $kod ) );
	}
	$govde = json_decode( wp_remote_retrieve_body( $kayit ), true );
	$upload_url = (string) ( $govde['value']['uploadMechanism']['com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest']['uploadUrl'] ?? '' );
	$asset      = (string) ( $govde['value']['asset'] ?? '' );
	if ( $upload_url === '' || $asset === '' ) {
		return new WP_Error( 'tilfy_linkedin', 'LinkedIn medya kayit yaniti gecersiz' );
	}
	$mime = wp_check_filetype( $dosya_yolu );
	$yukle = tilfy_linkedin_dosya_yukle( $upload_url, $dosya_yolu, $jeton, (string) ( $mime['type'] ?? 'application/octet-stream' ) );
	if ( is_wp_error( $yukle ) ) {
		return $yukle;
	}
	$yukle_kod = (int) wp_remote_retrieve_response_code( $yukle );
	if ( $yukle_kod < 200 || $yukle_kod >= 300 ) {
		return new WP_Error( 'tilfy_linkedin', 'LinkedIn medya yukleme HTTP ' . $yukle_kod );
	}
	return array(
		'asset' => $asset,
		'tur'   => $tur,
	);
}

function tilfy_linkedin_ugc_gonder( $jeton, $yazar, $metin, $medya = null ) {
	$share = array(
		'shareCommentary'    => array( 'text' => $metin ),
		'shareMediaCategory' => 'NONE',
	);
	if ( is_array( $medya ) && ! empty( $medya['asset'] ) ) {
		$share['shareMediaCategory'] = ( $medya['tur'] ?? 'image' ) === 'video' ? 'VIDEO' : 'IMAGE';
		$share['media']              = array(
			array(
				'status' => 'READY',
				'media'  => (string) $medya['asset'],
			),
		);
	}
	return wp_remote_post(
		'https://api.linkedin.com/v2/ugcPosts',
		array(
			'timeout' => 120,
			'headers' => tilfy_linkedin_ugc_basliklar( $jeton ),
			'body'    => wp_json_encode(
				array(
					'author'          => $yazar,
					'lifecycleState'  => 'PUBLISHED',
					'specificContent' => array(
						'com.linkedin.ugc.ShareContent' => $share,
					),
					'visibility'      => array(
						'com.linkedin.ugc.MemberNetworkVisibility' => 'PUBLIC',
					),
				)
			),
		)
	);
}

function tilfy_linkedin_paylasim_gonder( $icerik, $paylasim ) {
	$jeton = tilfy_linkedin_jeton();
	if ( $jeton === '' ) {
		return array( 'ok' => false, 'mesaj' => 'LinkedIn jetonu eksik' );
	}

	$yazar = tilfy_linkedin_yazar_urn( $jeton );
	if ( $yazar === '' ) {
		return array( 'ok' => false, 'mesaj' => 'LinkedIn profil ID alinamadi; LinkedIn ile yeniden baglanin' );
	}

	$medya = tilfy_icerik_medya_hazirla( $icerik );
	if ( is_wp_error( $medya ) ) {
		return array( 'ok' => false, 'mesaj' => $medya->get_error_message() );
	}

	$metin = (string) ( $paylasim->ozel_aciklama ?: $icerik->aciklama );
	$etiket = (string) ( $paylasim->ozel_etiketler ?: $icerik->etiketler );
	if ( $etiket !== '' ) {
		$metin .= "\n\n" . $etiket;
	}
	$metin = tilfy_metin_kisalt( $metin, 3000 );

	$li_medya = null;
	if ( ! empty( $medya['dosya_id'] ) ) {
		$dosya_yolu = get_attached_file( (int) $medya['dosya_id'] );
		if ( ! $dosya_yolu || ! file_exists( $dosya_yolu ) ) {
			return array( 'ok' => false, 'mesaj' => 'LinkedIn medya dosyasi bulunamadi' );
		}
		$tur   = tilfy_linkedin_dosya_tur( (int) $medya['dosya_id'] );
		$yukle = tilfy_linkedin_asset_yukle( $jeton, $yazar, $dosya_yolu, $tur );
		if ( is_wp_error( $yukle ) ) {
			return array( 'ok' => false, 'mesaj' => $yukle->get_error_message() );
		}
		$li_medya = $yukle;
	}

	$yanit = tilfy_linkedin_ugc_gonder( $jeton, $yazar, $metin, $li_medya );
	if ( is_wp_error( $yanit ) ) {
		return array( 'ok' => false, 'mesaj' => $yanit->get_error_message() );
	}

	$kod = (int) wp_remote_retrieve_response_code( $yanit );
	if ( $kod < 200 || $kod >= 300 ) {
		return array( 'ok' => false, 'mesaj' => tilfy_linkedin_hata_mesaji( $yanit, $kod ) );
	}

	$konum = wp_remote_retrieve_header( $yanit, 'x-restli-id' );
	return array(
		'ok'        => true,
		'hedef_id'  => is_string( $konum ) ? $konum : '',
		'hedef_url' => 'https://www.linkedin.com/feed/',
	);
}
