<?php
// core/crypto.php

function app_secret_key(): string {
    // ENV’den al: putenv / .env / config.php
    $k = getenv('APP_SECRET_KEY') ?: '';
    if (strlen($k) < 32) {
        // güvenli değil ama dev ortamında patlamasın diye:
        // prod’da bunu ERROR yapmanı öneririm.
        $k = hash('sha256', $k ?: 'CHANGE_ME_SECRET_KEY', true);
        return $k; // raw bytes
    }
    // string geldiyse hashleyip 32 byte’a sabitleyelim
    return hash('sha256', $k, true); // raw bytes
}

function encrypt_secret(string $plain): string {
    if ($plain === '') return '';
    $key = app_secret_key();
    $iv  = random_bytes(12); // GCM için 12 byte ideal
    $tag = '';
    $cipher = openssl_encrypt($plain, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
    $payload = [
        'v' => 1,
        'iv' => base64_encode($iv),
        'tag' => base64_encode($tag),
        'data' => base64_encode($cipher)
    ];
    return base64_encode(json_encode($payload, JSON_UNESCAPED_SLASHES));
}

function decrypt_secret(?string $enc): string {
    if (!$enc) return '';
    $raw = base64_decode($enc, true);
    if ($raw === false) return ''; // bozuk veri
    $j = json_decode($raw, true);
    if (!is_array($j) || empty($j['iv']) || empty($j['tag']) || empty($j['data'])) {
        return '';
    }
    $key = app_secret_key();
    $iv  = base64_decode($j['iv']);
    $tag = base64_decode($j['tag']);
    $data = base64_decode($j['data']);
    $plain = openssl_decrypt($data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
    return $plain === false ? '' : $plain;
}
