<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Response;
use ZipArchive;

class JsonTransferController extends Controller
{
    protected $exportPath = 'database/seeders/data/';

    public function index()
    {
        //POSTGRESS
        $tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
        $tableNames = array_map(fn($t) => $t->tablename, $tables);
        //MYSQL
        //$tables = DB::select('SHOW TABLES');
        //$tableNames = array_map('current', $tables);
        $tableInfo = [];

        foreach ($tableNames as $table) {
            $filePath = base_path($this->exportPath . $table . '.json');
            $fileSize = file_exists($filePath) ? filesize($filePath) : null;

            $tableInfo[] = [
                'name' => $table,
                'size' => $fileSize,
            ];
        }
        return view('backup', compact('tableInfo'));
    }

    public function generate()
    {
        //POSTGRESS
        
        $tables = DB::select("SELECT tablename FROM pg_tables WHERE schemaname = 'public'");
        $tableNames = array_map(fn($t) => $t->tablename, $tables);

        //MYSQL
        //$tables = DB::select('SHOW TABLES');
        //$tableNames = array_map('current', $tables);
        
        foreach ($tableNames as $table) {
            try {
                $data = DB::table($table)->get();
                $json = json_encode($data, JSON_PRETTY_PRINT);
                file_put_contents(base_path($this->exportPath . $table . '.json'), $json);
            } catch (\Exception $e) {
                // Bisa log error-nya atau skip tabel ini
                \Log::warning("Gagal ekspor tabel $table: " . $e->getMessage());
                continue;
            }
        }

        return redirect()->back()->with('success', 'Semua tabel berhasil diekspor.');
    }

    public function downloadTable($table)
    {
        $file = base_path($this->exportPath . $table . '.json');

        if (!file_exists($file)) {
            return abort(404, 'File tidak ditemukan.');
        }

        return response()->download($file);
    }

    public function downloadAll()
    {
        $zipFile = base_path('database/seeders/data/all_json.zip');
        $zip = new ZipArchive;

        File::delete($zipFile);

        if ($zip->open($zipFile, ZipArchive::CREATE) === TRUE) {
            foreach (File::files(base_path($this->exportPath)) as $file) {
                $zip->addFile($file->getRealPath(), basename($file));
            }
            $zip->close();
        }

        return response()->download($zipFile);
    }
    public function importTable($table)
    {
        $path = base_path($this->exportPath . $table . '.json');

        if (!file_exists($path)) {
            return redirect()->back()->with('error', "File JSON untuk tabel $table tidak ditemukan.");
        }

        $json = file_get_contents($path);
        $data = json_decode($json, true);

        if (!is_array($data)) {
            return redirect()->back()->with('error', "File JSON untuk tabel $table tidak valid.");
        }

        try {
            DB::beginTransaction();

            // Kosongkan tabel sebelum import (opsional, hati-hati!)
            DB::table($table)->truncate();

            $chunks = array_chunk($data, 200); // ubah 1000 sesuai kemampuan server

            foreach ($chunks as $chunk) {
                DB::table($table)->insert($chunk);
            }

            DB::commit();
            return redirect()->back()->with('success', "Data untuk tabel $table berhasil di-import.");
        } catch (\Exception $e) {
            DB::rollBack();
            return redirect()->back()->with('error', "Gagal import tabel $table: " . $e->getMessage());
        }
    }

}
