<?php
// includes/google_drive_helper.php
// Helper terpusat untuk integrasi Google Drive lewat Google Apps Script Web App.
// TIDAK butuh composer / Google API Client / Service Account JSON.
// Cukup curl bawaan PHP. File dikirim sebagai Base64 di dalam body JSON
// (bukan multipart/form-data) karena lebih andal untuk request server-to-server
// ke Apps Script doPost().
//
// Dipakai oleh modules/kumpulan_dokumen_laporan.php dan migrate_to_drive.php

declare(strict_types=1);

// ===== GANTI INI sesuai Web App URL hasil deploy Google Apps Script =====
// Lihat panduan di AppsScript_Code.gs untuk cara deploy.
// Formatnya: https://script.google.com/macros/s/XXXXXXXXXXXX/exec
define('GDRIVE_GAS_WEBAPP_URL', 'https://script.google.com/macros/s/AKfycbyAbFvgT39QD_1ZpEh1KmTLn1YarqBs2D9gNoBBmEWc20xu7gHV6BPeRgaX6JRfCfNf/exec');

// ===== GANTI INI sesuai SECRET_KEY yang diisi di Apps Script (Code.gs) =====
define('GDRIVE_GAS_SECRET_KEY', 'GRsbalimed2026!XyzAman');

if (!function_exists('gdrive_check_config')) {
    function gdrive_check_config(): void {
        if (GDRIVE_GAS_WEBAPP_URL === '' || strpos(GDRIVE_GAS_WEBAPP_URL, 'GANTI_DENGAN') !== false) {
            throw new RuntimeException('GDRIVE_GAS_WEBAPP_URL belum diatur. Edit includes/google_drive_helper.php dengan Web App URL hasil deploy Apps Script.');
        }
        if (GDRIVE_GAS_SECRET_KEY === '' || strpos(GDRIVE_GAS_SECRET_KEY, 'GANTI_DENGAN') !== false) {
            throw new RuntimeException('GDRIVE_GAS_SECRET_KEY belum diatur. Edit includes/google_drive_helper.php dan samakan dengan SECRET_KEY di Apps Script.');
        }
        if (!function_exists('curl_init')) {
            throw new RuntimeException('Ekstensi PHP cURL tidak aktif di server. Aktifkan ekstensi curl lewat cPanel -> Select PHP Version -> Extensions.');
        }
    }
}

if (!function_exists('gdrive_extract_folder_id')) {
    /**
     * Menerima input berupa folder ID polos ATAU link Google Drive lengkap,
     * mengembalikan folder ID saja.
     * Contoh input yang didukung:
     *  - 1Tlr7Y7prVcnRhjsDOhMvSCp3kX4WrkW8
     *  - https://drive.google.com/drive/folders/1Tlr7Y7prVcnRhjsDOhMvSCp3kX4WrkW8?usp=sharing
     */
    function gdrive_extract_folder_id(string $input): string {
        $input = trim($input);
        if ($input === '') return '';

        if (preg_match('#/folders/([a-zA-Z0-9_-]+)#', $input, $m)) {
            return $m[1];
        }
        if (preg_match('#[?&]id=([a-zA-Z0-9_-]+)#', $input, $m)) {
            return $m[1];
        }
        // Kalau bukan URL, asumsikan sudah berupa ID langsung.
        if (preg_match('#^[a-zA-Z0-9_-]{10,}$#', $input)) {
            return $input;
        }
        return '';
    }
}

if (!function_exists('gdrive_call_gas')) {
    /**
     * Memanggil Apps Script Web App via cURL, body berupa JSON.
     *
     * @param array $payload Data yang akan di-JSON-encode dan dikirim sebagai body POST.
     * @return array Hasil decode JSON dari respons Apps Script.
     */
    function gdrive_call_gas(array $payload): array {
        gdrive_check_config();

        $payload['key'] = trim(GDRIVE_GAS_SECRET_KEY);
        $jsonBody = json_encode($payload);
        if ($jsonBody === false) {
            throw new RuntimeException('Gagal encode payload JSON untuk dikirim ke Apps Script: ' . json_last_error_msg());
        }

        $ch = curl_init(GDRIVE_GAS_WEBAPP_URL);
        curl_setopt_array($ch, [
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => $jsonBody,
            CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true, // Apps Script kadang redirect 302 sebelum hasil akhir
            CURLOPT_TIMEOUT => 180,
            CURLOPT_SSL_VERIFYPEER => true,
        ]);

        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $curlError = curl_error($ch);
        curl_close($ch);

        if ($response === false) {
            throw new RuntimeException('Gagal menghubungi Google Apps Script: ' . $curlError);
        }

        $decoded = json_decode($response, true);
        if (!is_array($decoded)) {
            throw new RuntimeException('Respons Apps Script tidak valid (HTTP ' . $httpCode . '). Cuplikan respons: ' . substr(strip_tags((string)$response), 0, 300));
        }

        if (empty($decoded['success'])) {
            throw new RuntimeException('Apps Script menolak permintaan: ' . (string)($decoded['error'] ?? 'Error tidak diketahui.'));
        }

        return $decoded;
    }
}

if (!function_exists('gdrive_upload_file')) {
    /**
     * Upload file dari path lokal (staging sementara) ke Google Drive lewat Apps Script.
     * File dibaca, di-encode Base64, lalu dikirim sebagai bagian dari body JSON.
     *
     * @param string $localFilePath Path file fisik sementara di server.
     * @param string $fileName      Nama file yang akan tampil di Drive.
     * @param string $parentFolderId Folder ID tujuan di Drive.
     * @param string $mimeType     MIME type file.
     * @return array{id:string,webViewLink:string,name:string}
     */
    function gdrive_upload_file(string $localFilePath, string $fileName, string $parentFolderId, string $mimeType = 'application/octet-stream'): array {
        if (!is_file($localFilePath)) {
            throw new RuntimeException('File lokal sementara tidak ditemukan untuk diupload ke Drive: ' . $localFilePath);
        }
        if ($parentFolderId === '') {
            throw new RuntimeException('Folder Google Drive tujuan belum diatur untuk folder unit ini. Isi link/ID folder Drive lewat menu "Edit Folder" terlebih dahulu.');
        }

        // Catatan: Base64 menambah ~33% ukuran data terkirim. Apps Script Web App
        // punya batas ukuran request (umumnya di kisaran 50MB untuk body POST),
        // jadi modul ini sudah membatasi upload maksimal 30MB di sisi PHP.
        $rawContent = file_get_contents($localFilePath);
        if ($rawContent === false) {
            throw new RuntimeException('Gagal membaca isi file sementara sebelum diupload ke Drive.');
        }
        $base64Content = base64_encode($rawContent);
        unset($rawContent); // bebaskan memori secepatnya untuk file besar

        $result = gdrive_call_gas([
            'action' => 'upload',
            'folder_id' => $parentFolderId,
            'file_name' => $fileName,
            'mime_type' => $mimeType,
            'file_base64' => $base64Content,
        ]);

        return [
            'id' => (string)$result['file_id'],
            'webViewLink' => (string)$result['file_url'],
            'name' => (string)($result['file_name'] ?? $fileName),
        ];
    }
}

if (!function_exists('gdrive_find_or_create_subfolder')) {
    /**
     * Mencari/membuat subfolder dengan nama tertentu di dalam $parentFolderId via Apps Script.
     * Mengembalikan folder ID subfolder tersebut.
     */
    function gdrive_find_or_create_subfolder(string $parentFolderId, string $folderName): string {
        $result = gdrive_call_gas([
            'action' => 'create_folder',
            'parent_folder_id' => $parentFolderId,
            'folder_name' => $folderName,
        ]);
        return (string)$result['folder_id'];
    }
}

if (!function_exists('gdrive_delete_file')) {
    function gdrive_delete_file(string $fileId): bool {
        try {
            gdrive_call_gas(['action' => 'delete_file', 'file_id' => $fileId]);
            return true;
        } catch (Throwable $e) {
            return false;
        }
    }
}

if (!function_exists('gdrive_folder_view_url')) {
    function gdrive_folder_view_url(string $folderId): string {
        return 'https://drive.google.com/drive/folders/' . rawurlencode($folderId);
    }
}

if (!function_exists('gdrive_file_view_url')) {
    function gdrive_file_view_url(string $fileId): string {
        return 'https://drive.google.com/file/d/' . rawurlencode($fileId) . '/view';
    }
}
