<?php

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

add_action( 'rest_api_init', 'tilfy_rest_kayit' );

function tilfy_rest_kayit() {
	$rotalar = array(
		'/ozet'            => array( 'GET', 'tilfy_rest_ozet' ),
		'/icerikler'       => array( 'GET', 'tilfy_rest_icerikler' ),
		'/paylasimlar'     => array( 'GET', 'tilfy_rest_paylasimlar' ),
		'/paylasim-durum'  => array( 'GET', 'tilfy_rest_paylasim_durum' ),
		'/paylasim-baslat' => array( 'POST', 'tilfy_rest_paylasim_baslat' ),
		'/kuyruk-adim'     => array( 'POST', 'tilfy_rest_kuyruk_adim' ),
		'/senkron'         => array( 'POST', 'tilfy_rest_senkron' ),
		'/capraz'          => array( 'POST', 'tilfy_rest_capraz' ),
		'/kuyruk'          => array( 'POST', 'tilfy_rest_kuyruk' ),
	);
	foreach ( $rotalar as $yol => $bilgi ) {
		register_rest_route(
			'tilfy/v1',
			$yol,
			array(
				'methods'             => $bilgi[0],
				'callback'            => $bilgi[1],
				'permission_callback' => 'tilfy_rest_yetki',
			)
		);
	}
}

function tilfy_rest_yetki() {
	return current_user_can( 'manage_options' );
}

function tilfy_rest_ozet() {
	$baglanti = tilfy_baglanti_durumu();
	foreach ( $baglanti as $k => $v ) {
		if ( is_array( $v ) ) {
			$baglanti[ $k ] = array_map( 'boolval', $v );
		}
	}
	return rest_ensure_response(
		array(
			'ok'       => true,
			'istatistik' => tilfy_istatistik_ozet(),
			'baglanti' => $baglanti,
		)
	);
}

function tilfy_rest_icerikler( $istek ) {
	$sayfa = max( 1, (int) $istek->get_param( 'sayfa' ) );
	$args  = array(
		'page'     => $sayfa,
		'per_page' => min( 100, max( 1, (int) $istek->get_param( 'per_page' ) ?: 50 ) ),
	);
	$liste = tilfy_icerik_listele( $args );
	$toplam = tilfy_icerik_say( $args );
	return rest_ensure_response(
		array(
			'ok'     => true,
			'liste'  => $liste,
			'toplam' => $toplam,
			'sayfa'  => $sayfa,
		)
	);
}

function tilfy_rest_paylasimlar( $istek ) {
	$sayfa = max( 1, (int) $istek->get_param( 'sayfa' ) );
	$args  = array(
		'page'     => $sayfa,
		'per_page' => min( 100, max( 1, (int) $istek->get_param( 'per_page' ) ?: 50 ) ),
		'durum'    => sanitize_key( (string) $istek->get_param( 'durum' ) ),
		'hedef'    => sanitize_key( (string) $istek->get_param( 'hedef' ) ),
	);
	$liste  = tilfy_paylasim_listele( $args );
	$toplam = tilfy_paylasim_say( $args );
	return rest_ensure_response(
		array(
			'ok'     => true,
			'liste'  => $liste,
			'toplam' => $toplam,
			'sayfa'  => $sayfa,
		)
	);
}

function tilfy_rest_senkron( $istek ) {
	$platform = sanitize_key( (string) $istek->get_param( 'platform' ) );
	$mod      = sanitize_key( (string) ( $istek->get_param( 'mod' ) ?: 'yeni' ) );
	if ( ! function_exists( 'tilfy_kuyruk_ekle' ) ) {
		return tilfy_rest_yanit_hata( 'Kuyruk modulu yok', 500 );
	}
	if ( $platform === 'tumu' ) {
		tilfy_kuyruk_ekle( 'tumu_senkron', array( 'mod' => $mod ) );
	} elseif ( $platform === 'wordpress' ) {
		tilfy_kuyruk_ekle( 'icerik_cek', array( 'platform' => 'wordpress', 'mod' => $mod ) );
	} elseif ( in_array( $platform, array( 'instagram', 'facebook', 'youtube' ), true ) ) {
		tilfy_kuyruk_ekle( 'icerik_cek', array( 'platform' => $platform, 'mod' => $mod ) );
		tilfy_kuyruk_ekle( 'istatistik_sync', array( 'platform' => $platform ) );
	} elseif ( $platform === 'threads' && function_exists( 'tilfy_threads_api_aktif_mi' ) && tilfy_threads_api_aktif_mi() ) {
		tilfy_kuyruk_ekle( 'icerik_cek', array( 'platform' => 'threads', 'mod' => $mod ) );
	} else {
		return tilfy_rest_yanit_hata( 'Gecersiz platform', 400 );
	}
	tilfy_kuyruk_calistir();
	return rest_ensure_response( array( 'ok' => true, 'mesaj' => 'Senkron tamamlandi', 'mod' => $mod ) );
}

function tilfy_rest_capraz( $istek ) {
	@set_time_limit( 300 );
	@ini_set( 'memory_limit', '256M' );
	if ( ! function_exists( 'tilfy_capraz_ortak_hazirla' ) || ! function_exists( 'tilfy_capraz_islem_yurut' ) ) {
		return tilfy_rest_yanit_hata( 'Capraz modulu yok', 500 );
	}
	$idler = $istek->get_param( 'icerik_idler' );
	$hedef = $istek->get_param( 'hedef_platformlar' );
	if ( ! is_array( $idler ) || ! is_array( $hedef ) ) {
		return tilfy_rest_yanit_hata( 'Eksik parametre', 400 );
	}
	$idler = array_values( array_filter( array_map( 'intval', (array) $idler ) ) );
	if ( count( $idler ) > 100 ) {
		return tilfy_rest_yanit_hata( 'En fazla 100 icerik secilebilir', 400 );
	}
	$hedef = array_values(
		array_filter(
			array_map( 'sanitize_key', $hedef ),
			function ( $platform ) {
				if ( ! tilfy_platform_aktif_mi( $platform ) ) {
					return false;
				}
				return function_exists( 'tilfy_platform_paylasim_hazir_mi' ) ? tilfy_platform_paylasim_hazir_mi( $platform ) : tilfy_platform_hedef_mi( $platform );
			}
		)
	);
	$kaynak = sanitize_key( (string) $istek->get_param( 'kaynak_platform' ) );
	if ( $kaynak !== '' ) {
		$hedef = array_values( array_diff( $hedef, array( $kaynak ) ) );
	}
	if ( $kaynak === 'tumu' ) {
		$kaynak = '';
	}
	if ( empty( $idler ) || empty( $hedef ) ) {
		return tilfy_rest_yanit_hata( 'En az bir icerik ve hedef platform secin', 400 );
	}
	if ( $kaynak !== '' && ! tilfy_platform_aktif_mi( $kaynak ) ) {
		return tilfy_rest_yanit_hata( 'Kaynak, icerik ve hedef platform gerekli', 400 );
	}
	$veri = array(
		'zamanlama'             => $istek->get_param( 'zamanlama' ),
		'gunluk_adet'           => $istek->get_param( 'gunluk_adet' ),
		'paylasim_arasi_dakika' => $istek->get_param( 'paylasim_arasi_dakika' ),
	);
	$ortak = tilfy_capraz_ortak_hazirla( $veri, count( $idler ) );
	if ( is_wp_error( $ortak ) ) {
		$status = $ortak->get_error_code() === 'zamanlama_yok' ? 500 : 400;
		return tilfy_rest_yanit_hata( $ortak->get_error_message(), $status );
	}
	$zorla            = ! empty( $istek->get_param( 'yinelenen_zorla' ) );
	$platform_ayarlar = (array) $istek->get_param( 'platform_ayar' );
	$sonuc            = tilfy_capraz_islem_yurut( $idler, $hedef, $ortak, $kaynak, $platform_ayarlar, $zorla );
	if ( is_wp_error( $sonuc ) ) {
		$kod = $sonuc->get_error_code();
		if ( $kod === 'yinelenen_engellendi' ) {
			$data = $sonuc->get_error_data();
			return new WP_Error(
				'yinelenen_engellendi',
				$sonuc->get_error_message(),
				array(
					'status'     => 400,
					'engellenen' => is_array( $data ) ? ( $data['engellenen'] ?? array() ) : array(),
					'uyarilar'   => is_array( $data ) ? ( $data['uyarilar'] ?? array() ) : array(),
				)
			);
		}
		$status = 400;
		if ( $kod === 'capraz_dedupe' ) {
			$status = 429;
		} elseif ( $kod === 'capraz_yok' || $kod === 'zamanlama_yok' ) {
			$status = 500;
		}
		return tilfy_rest_yanit_hata( $sonuc->get_error_message(), $status );
	}
	return rest_ensure_response(
		array(
			'ok'           => true,
			'adet'         => (int) ( $sonuc['adet'] ?? 0 ),
			'paylasim_ids' => array_map( 'intval', (array) ( $sonuc['paylasim_ids'] ?? array() ) ),
			'uyarilar'     => (array) ( $sonuc['uyarilar'] ?? array() ),
			'engellenen'   => (array) ( $sonuc['engellenen'] ?? array() ),
		)
	);
}

function tilfy_rest_kuyruk() {
	tilfy_kuyruk_calistir();
	return rest_ensure_response( array( 'ok' => true ) );
}

function tilfy_rest_paylasim_baslat( $istek ) {
	$govde = $istek->get_json_params();
	if ( empty( $govde ) || ! is_array( $govde ) ) {
		$govde = $istek->get_body_params();
	}
	if ( empty( $govde ) || ! is_array( $govde ) ) {
		return tilfy_rest_yanit_hata( 'Eksik veri', 400 );
	}
	if ( ! function_exists( 'tilfy_paylasim_baslat' ) ) {
		return tilfy_rest_yanit_hata( 'Paylasim modulu yok', 500 );
	}
	$sonuc = tilfy_paylasim_baslat( $govde );
	if ( empty( $sonuc['ok'] ) ) {
		return tilfy_rest_yanit_hata( $sonuc['mesaj'] ?? 'Paylasim baslatilamadi', 400 );
	}
	tilfy_kuyruk_calistir();
	return rest_ensure_response( $sonuc );
}

function tilfy_rest_kuyruk_adim() {
	if ( ! function_exists( 'tilfy_kuyruk_tek_adim' ) ) {
		return tilfy_rest_yanit_hata( 'Kuyruk modulu yok', 500 );
	}
	@set_time_limit( 300 );
	if ( function_exists( 'tilfy_kuyruk_hazirlik' ) ) {
		tilfy_kuyruk_hazirlik();
	}
	$sonuc = tilfy_kuyruk_tek_adim();
	return rest_ensure_response( $sonuc );
}

function tilfy_rest_paylasim_durum( $istek ) {
	$ids = $istek->get_param( 'ids' );
	if ( ! is_array( $ids ) ) {
		return tilfy_rest_yanit_hata( 'Eksik ids', 400 );
	}
	if ( ! function_exists( 'tilfy_paylasimlar_durum_getir' ) ) {
		return tilfy_rest_yanit_hata( 'Durum modulu yok', 500 );
	}
	return rest_ensure_response( tilfy_paylasimlar_durum_getir( array_map( 'intval', $ids ) ) );
}
