package server.debug;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

/**
 * Загружает debug token из файла .debug-token в корне проекта.
 */
public final class DebugTokenProvider {
    private static final Logger log = LoggerFactory.getLogger(DebugTokenProvider.class);
    private static final String TOKEN_FILE_NAME = ".debug-token";

    private final String token;

    private DebugTokenProvider(String token) {
        this.token = token;
    }

    public static DebugTokenProvider loadFromProjectRoot() {
        Path tokenPath = Path.of(TOKEN_FILE_NAME).toAbsolutePath().normalize();
        String loaded = "";
        try {
            if (Files.exists(tokenPath)) {
                loaded = Files.readString(tokenPath, StandardCharsets.UTF_8).trim();
            }
        } catch (IOException e) {
            log.error("Не удалось прочитать debug token из {}", tokenPath, e);
        }

        if (loaded.isBlank()) {
            log.warn("⚠️ Debug API отключены: файл {} отсутствует или пуст.", tokenPath);
        } else {
            log.info("✅ Debug API включены, token файл найден: {}", tokenPath);
        }
        return new DebugTokenProvider(loaded);
    }

    public boolean isEnabled() {
        return token != null && !token.isBlank();
    }

    public boolean matchesBearerHeader(String authorizationHeader) {
        if (!isEnabled()) return false;
        if (authorizationHeader == null || authorizationHeader.isBlank()) return false;
        if (!authorizationHeader.startsWith("Bearer ")) return false;
        String actual = authorizationHeader.substring("Bearer ".length()).trim();
        return token.equals(actual);
    }

    public boolean matchesRawToken(String rawToken) {
        if (!isEnabled()) return false;
        if (rawToken == null || rawToken.isBlank()) return false;
        return token.equals(rawToken.trim());
    }
}
