<?php
require_once (dirname(__DIR__, 2) . '/init.php');

// Live editor kaydetme yetki kontrolü: edit izni yoksa engelle
if (function_exists('can')){
    // post ID üzerinden modül adı çekiliyor
    $tmpId = isset($_POST['id']) ? (int)$_POST['id'] : 0;
    $module = null;
    if ($tmpId > 0 && function_exists('post')){
        $p = post($tmpId);
        if (is_array($p) && isset($p['module_type'])){ $module = (string)$p['module_type']; }
    }
    if ($module && !can('edit', $module)){
        header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden', true, 403);
        echo json_encode([
            'status' => 'danger',
            'message' => 'Bu işlem için yetkiniz yok.',
            'title' => 'Yetkisiz İşlem',
            'status_title' => 'Hata'
        ]);
        exit;
    }
}

define('MAX_FILE_LIMIT', 1024 * 1024 * 2);//2 Megabytes max html file size

function sanitizeFileName($file, $allowedExtension = 'html') {
	//sanitize, remove double dot .. and remove get parameters if any
//	$file = __DIR__ . '/' . preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));
	$file = preg_replace('@\?.*$@' , '', preg_replace('@\.{2,}@' , '', preg_replace('@[^\/\\a-zA-Z0-9\-\._]@', '', $file)));

	//allow only .html extension
	if ($allowedExtension) {
		$file = preg_replace('/\.[^.]+$/', '', $file) . ".$allowedExtension";
	}
	return $file;
}

function showError($error) {
	header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
	die($error);
}

$html   = '';
$file   = '';
$action = '';
$id = '';

if (isset($_POST['startTemplateUrl']) && !empty($_POST['startTemplateUrl'])) {
	$startTemplateUrl = sanitizeFileName($_POST['startTemplateUrl']);
	$html = file_get_contents($startTemplateUrl);
    $html = trim($html);
} else if (isset($_POST['html'])){
	$html = substr($_POST['html'], 0, MAX_FILE_LIMIT);
    $html = trim($html);
}

if (isset($_POST['file'])) {
	$file = sanitizeFileName($_POST['file'], false);
}
if (isset($_GET['action'])) {
	$action = $_GET['action'];
}
if (isset($_POST['id'])) {
	$id = $_POST['id'];
}


$pathInfo = pathinfo($file);

// Dosyanın uzantısı
$extension = $pathInfo['extension'];

if ($action) {
	switch ($action) {
		case 'rename':
			$newfile = sanitizeFileName($_POST['newfile'], false);
			if ($file && $newfile) {

                $newFilePath = UPLOAD_DIR.'/'.$newfile.'.'.$extension;
                $i = 1;

                // Dosya adı benzersiz olana kadar döngüyü devam ettir
                while (file_exists($newFilePath)) {
                    // Benzersiz bir dosya adı oluşturmak için sonek ekleyin
                    $newfileWithSuffix = $newfile . '_' . $i;
                    $newFilePath = UPLOAD_DIR.'/'.$newfileWithSuffix.'.'.$extension;
                    $i++;
                }

                $rename = rename(ROOT_FOLDER.$file, $newFilePath);
				if ($rename) {
                    $result = [
                        'status' => 'success',
                        'data' => $newFilePath,
                        'message' => "'$file' dosyasının ismi '$newfile' olarak değiştirildi!",
                        'title' => 'İsim Değişkliği',
                        'status_title' => 'Başarılı'
                    ];

				} else {
                    $result = [
                        'status' => 'error',
                        'data' => '',
                        'message' => "'$file' dosyasının ismi '$newfile' olarak değiştirilemedi!",
                        'title' => 'İsim Değişkliği',
                        'status_title' => 'Başarısız'
                    ];
				}
                echo json_encode($result);
			}
		break;
		case 'delete':

			if ($file) {
				if (unlink(ROOT_FOLDER.$file)) {
                    $result = [
                        'status' => 'success',
                        'message' => "'$file' dosyası silindi!",
                        'title' => 'Dosya Silme',
                        'status_title' => 'Başarılı'
                    ];
				} else {
					showError("Error deleting file '$file'");
				}
                echo json_encode($result);
			}
		break;
		case 'saveReusable':
		    //block or section
			$type = $_POST['type'] ?? false;
			$name = $_POST['name'] ?? false;
			$html = $_POST['html'] ?? false;
			
			if ($type && $name && $html) {
				
				$file = sanitizeFileName("$type/$name");
				$dir = dirname($file);
				if (!is_dir($dir)) {
					echo "$dir folder does not exist\n";
					if (mkdir($dir, 0777, true)) {
						echo "$dir folder was created\n";
					} else {
						showError("Error creating folder '$dir'\n");
					}				
				}
				
				if (file_put_contents($file, $html)) {
					echo "File saved '$file'";
				} else {
					showError("Error saving file '$file'\nPossible causes are missing write permission or incorrect file path!");
				}
			} else {
				showError("Missing reusable element data!\n");
			}
		break;
		case 'oembedProxy':
			header('Content-Type: application/json');
			echo file_get_contents($_GET['url']);
		break;
		default:
			showError("Invalid action '$action'!");
	}
} else {
	//save page
	if ($html) {
//        $html = preg_replace('/z-index\s*:\s*\d+\s*;?/i', '', $html);

        $post_Save = post_content_save($id, $html);

        // Otomatik çeviri (isteğe bağlı ve butona göre):
        // Sadece "Çevirerek Kaydet" tetiklendiğinde ve sağlayıcı açıkken çalışsın
        // Ayarlar: translate_provider, translate_source, translate_targets, translate_glossary
        $langDefault = lang_is_default('lang_code');
        $provider = general_settings('translate_provider', $langDefault) ?: 'none';
        $doTranslate = isset($_POST['do_translate']) && (string)$_POST['do_translate'] === '1';
        if ($doTranslate && $provider !== 'none') {
            $src = general_settings('translate_source', $langDefault) ?: $langDefault;
            $targets = array_filter(array_map('trim', explode(',', general_settings('translate_targets', $langDefault) ?: '')));
            $glossaryJson = general_settings('translate_glossary', $langDefault);
            $glossary = [];
            if ($glossaryJson) {
                $gj = json_decode($glossaryJson, true);
                if (json_last_error() === JSON_ERROR_NONE && is_array($gj)) $glossary = $gj;
            }
            if ($id && !empty($targets) && function_exists('translate_html')) {
                // Kaynak post'u al ve lang_ref_id üzerinden kardeşleri bulun
                $postSrc = post($id);
                if ($postSrc && $postSrc['lang'] === $src) {
                    // Hedef her dil için çeviri üret/güncelle
                    foreach ($targets as $dest) {
                        if ($dest === $src) continue;
                        $translatedHtml = translate_html($html, $src, $dest, $glossary);
                        if (!is_string($translatedHtml) || trim($translatedHtml) === '') {
                            $translatedHtml = $html; // fallback
                        }

                        // Başlık ve SEO alanları için çeviri
                        $srcTitle = (string)($postSrc['title'] ?? '');
                        $srcSeoTitle = (string)($postSrc['seo_title'] ?? '');
                        $srcSeoDesc = (string)($postSrc['seo_description'] ?? '');
                        $translatedTitle = $srcTitle !== '' ? translate_text($srcTitle, $src, $dest, $glossary) : $srcTitle;
                        if (!is_string($translatedTitle) || trim($translatedTitle) === '') { $translatedTitle = $srcTitle; }
                        $translatedSeoTitle = $srcSeoTitle !== '' ? translate_text($srcSeoTitle, $src, $dest, $glossary) : $srcSeoTitle;
                        if (!is_string($translatedSeoTitle) || trim($translatedSeoTitle) === '') { $translatedSeoTitle = $srcSeoTitle; }
                        $translatedSeoDesc = $srcSeoDesc !== '' ? translate_text($srcSeoDesc, $src, $dest, $glossary) : $srcSeoDesc;
                        if (!is_string($translatedSeoDesc) || trim($translatedSeoDesc) === '') { $translatedSeoDesc = $srcSeoDesc; }

                        // Kardeş post var mı?
                        $siblings = post_with_id($id);
                        $targetPostId = null; $targetPostRow = null;
                        foreach ($siblings as $sib) {
                            if ($sib['lang'] === $dest) { $targetPostId = $sib['id']; $targetPostRow = $sib; break; }
                        }
                        $db = new DB();

                        // slug üretimi (ilk oluşturma veya boşsa)
                        $finalSef = null;
                        if ($translatedTitle !== '') {
                            $baseSlug = m_sef($translatedTitle);
                            $candidate = $baseSlug ?: ($postSrc['sef'] ? ($postSrc['sef'].'-'.$dest) : null);
                            if ($candidate) {
                                $exists = $db->table('posts')->where('sef', '=', $candidate)->get();
                                if (($exists['total_count'] ?? 0) > 0) {
                                    $i = 1;
                                    do {
                                        $try = ($baseSlug ?: ($postSrc['sef'] ?: 'page')) . '-' . $dest . ($i > 1 ? '-' . $i : '');
                                        $exists2 = $db->table('posts')->where('sef', '=', $try)->get();
                                        if (($exists2['total_count'] ?? 0) == 0) { $candidate = $try; break; }
                                        $i++;
                                    } while ($i < 50);
                                }
                                $finalSef = $candidate;
                            }
                        }

                        if ($targetPostId) {
                            $updateData = [
                                'content' => $translatedHtml,
                                'updated_at' => $db->now()
                            ];
                            if ($translatedTitle !== '') { $updateData['title'] = $translatedTitle; }
                            if ($translatedSeoTitle !== '') { $updateData['seo_title'] = $translatedSeoTitle; }
                            if ($translatedSeoDesc !== '') { $updateData['seo_description'] = $translatedSeoDesc; }
                            if ($finalSef && (empty($targetPostRow['sef']))) { $updateData['sef'] = $finalSef; }
                            $db->table('posts')->where('id', '=', $targetPostId)->update($updateData);
                        } else {
                            $srcPost = post($id);
                            $db->table('posts')->insert([
                                'lang' => $dest,
                                'parent_id' => $srcPost['parent_id'] ?? 0,
                                'category_id' => $srcPost['category_id'] ?? null,
                                'lang_ref_id' => $srcPost['lang_ref_id'],
                                'module_type' => $srcPost['module_type'],
                                'title' => $translatedTitle ?: $srcPost['title'],
                                'description' => $srcPost['description'],
                                'content' => $translatedHtml,
                                'image' => $srcPost['image'],
                                'icon' => $srcPost['icon'],
                                'images' => $srcPost['images'],
                                'sef' => $finalSef ?: ($srcPost['sef'] ? ($srcPost['sef'].'-'.$dest) : null),
                                'seo_title' => $translatedSeoTitle ?: $srcPost['seo_title'],
                                'seo_description' => $translatedSeoDesc ?: $srcPost['seo_description'],
                                'seo_keywords' => $srcPost['seo_keywords'],
                                'features' => $srcPost['features'],
                                'status' => $srcPost['status'],
                                'sort' => $srcPost['sort'],
                                'created_at' => $db->now(),
                                'updated_at' => $db->now(),
                            ]);
                        }
                    }
                }
            }
        }
        if ($post_Save) {
            $result = [
                'status' => 'success',
                'message' => "İşlem başarılı! Sayfa Kaydedildi.",
                'title' => 'Sayfa Kaydet',
                'status_title' => 'Başarılı'
            ];
        } else {
            $result = [
                'status' => 'danger',
                'message' => "İşlem başarısız! Sayfa Kaydedilemedi.",
                'title' => 'Sayfa Kaydet',
                'status_title' => 'Başarısız'
            ];
        }
        echo json_encode($result);

	} else {
		showError('Html content is empty!');
	}
}
