<?php

namespace App\Http\Controllers;

use App\Services\SupabaseService;
use Illuminate\Http\Request;

class InternalController extends Controller
{
    /**
     * Password default untuk akun instansi yang dibuat dari halaman internal.
     */
    private const DEFAULT_PASSWORD = 'BpsMantao2025!';

    public function __construct(private SupabaseService $supabase)
    {
    }

    /**
     * Menampilkan halaman internal utama.
     */
    public function index()
    {
        // Ambil daftar instansi + link Drive dari database (instansi_ref).
        $instansiData = [];
        foreach ($this->supabase->getAllInstansiRef() as $row) {
            $instansiData[] = [
                'nama' => $row['nama_instansi'],
                'link' => $row['gdrive_link'] ?? '#',
            ];
        }

        return view('internal.index', [
            'all_instansi' => $instansiData,
        ]);
    }

    /**
     * Memproses pembuatan akun baru dari halaman internal.
     */
    public function createUser(Request $request)
    {
        $request->validate([
            'email' => 'required|email',
            'nama_instansi' => 'required|string|max:255',
        ]);

        $email = $request->input('email');
        $namaInstansi = $request->input('nama_instansi');

        if ($this->supabase->emailExists($email)) {
            return back()->with('error', 'Gagal membuat akun: Email tersebut sudah terdaftar.');
        }

        try {
            // 1. Buat akun Supabase Auth dengan password default.
            $authUid = $this->supabase->adminCreateUser($email, self::DEFAULT_PASSWORD, [
                'full_name' => $namaInstansi,
            ]);

            // 2. Lengkapi baris public.users (dibuat otomatis trigger).
            $userId = $this->supabase->ensureUserRow($authUid, $email, [
                'name' => $namaInstansi,
                'role' => 'instansi',
            ]);

            // 3. Insert akun ke public.instansi (default level = 'user'),
            //    tautkan ke organisasi (instansi_ref) bila namanya cocok.
            $ref = $this->supabase->getInstansiRefByNama($namaInstansi);
            $this->supabase->insertInstansi([
                'user_id' => $userId,
                'nama_instansi' => $namaInstansi,
                'level' => 'user',
                'instansi_ref_id' => $ref['id'] ?? null,
            ]);
        } catch (\Throwable $e) {
            return back()->with('error', 'Gagal membuat akun: ' . $e->getMessage());
        }

        return back()->with('success', 'Akun untuk ' . $namaInstansi . ' berhasil dibuat!');
    }
}
