<?php

namespace Shm\ShmUtils\ShmDoctor;

use Shm\ShmCmd\Cmd;
use Shm\ShmUtils\ShmInit;

class SymlinkManager
{
    /**
     * Create symlinks for admin static files and directories
     */
    public static function createSymlinks(): void
    {
        $links = [
            ShmInit::$rootDir . '/public/static_admin' => ShmInit::$shmDir . '/../admin/dist/static_admin',
            //     ShmInit::$rootDir . '/public/static/main.js' => ShmInit::$shmDir . '/../admin/dist/main.js',
            //     ShmInit::$rootDir . '/public/static/main.css' => ShmInit::$shmDir . '/../admin/dist/main.css',
            ShmInit::$rootDir . '/public/static/chat.js' => ShmInit::$shmDir . '/../chat/dist/chat.js',
            ShmInit::$rootDir . '/public/static/chat.css' => ShmInit::$shmDir . '/../chat/dist/chat.css',
        ];

        $isCli = Cmd::cli();

        foreach ($links as $target => $source) {
            self::ensureSymlink($target, $source, $isCli);
        }
    }

    private static function ensureSymlink(string $target, string $source, bool $isCli): void
    {
        $targetDir = dirname($target);

        if (!file_exists($source)) {
            if (is_link($target)) {
                unlink($target);
                self::log($isCli, "Удалена старая ссылка, исходный путь отсутствует: $target");
            } elseif (file_exists($target)) {
                self::log($isCli, "⚠️ Исходный путь отсутствует, но $target — обычный файл/директория, не трогаем");
            }
            self::log($isCli, "❌ Исходный путь не найден: $source");
            return;
        }

        $sourceReal = realpath($source);
        if ($sourceReal === false) {
            self::log($isCli, "❌ Не удалось получить абсолютный путь: $source");
            return;
        }

        if (!is_dir($targetDir)) {
            mkdir($targetDir, 0777, true);
            self::log($isCli, "Создана директория: $targetDir");
        }

        if (file_exists($target) && !is_link($target)) {
            self::log($isCli, "⚠️ Пропуск: $target уже существует как обычный файл/директория");
            return;
        }

        if (is_link($target)) {
            $linkReal = realpath($target);
            if ($linkReal !== false && $linkReal === $sourceReal) {
                self::log($isCli, "⏭ Ссылка уже актуальна: $target -> $sourceReal");
                return;
            }

            unlink($target);
            self::log($isCli, "Удалена устаревшая или битая ссылка: $target");
        }

        if (symlink($sourceReal, $target)) {
            self::log($isCli, "✅ Создана ссылка: $target -> $sourceReal");
        } else {
            self::log($isCli, "❌ Не удалось создать ссылку: $target -> $sourceReal");
        }
    }

    private static function log(bool $isCli, string $message): void
    {
        if ($isCli) {
            echo "$message\n";
        }
    }
}
