<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Branch;
use Illuminate\Database\QueryException; // Tambahan wajib untuk menangkap error constraint database

class AdminBranchController extends Controller
{
    public function index()
    {
        try {
            // Semua pengguna (termasuk admin cabang) dapat melihat daftar cabang 
            // untuk keperluan operasional seperti filter laporan atau transfer antar gudang.
            $branches = Branch::orderBy('name', 'asc')->get();
            return response()->json(['success' => true, 'data' => $branches], 200);
        } catch (\Exception $e) {
            return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
        }
    }

    public function store(Request $request)
    {
        $user = $request->user();
        
        // PENAMBAHAN: Proteksi Hak Akses Pusat
        // Mencegah admin cabang membuat entitas cabang baru
        if ($user && $user->role !== 'owner') {
            return response()->json([
                'success' => false, 
                'message' => 'Akses ditolak: Hanya Owner yang berhak menambah cabang baru.'
            ], 403);
        }

        $request->validate([
            'name' => 'required|string|max:255',
            'code' => 'required|string|max:10|unique:branches,code',
            'credit_price_system' => 'required|in:sama_dengan_tunai,markup_persen,turun_level',
        ]);

        try {
            $branch = Branch::create($request->all());
            return response()->json(['success' => true, 'message' => 'Cabang berhasil dibuat', 'data' => $branch], 201);
        } catch (\Exception $e) {
            return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
        }
    }

    public function update(Request $request, $id)
    {
        $user = $request->user();
        
        // PENAMBAHAN: Proteksi Hak Akses Pusat
        if ($user && $user->role !== 'owner') {
            return response()->json([
                'success' => false, 
                'message' => 'Akses ditolak: Hanya Owner yang berhak mengubah data cabang.'
            ], 403);
        }

        $branch = Branch::find($id);
        if (!$branch) return response()->json(['success' => false, 'message' => 'Cabang tidak ditemukan'], 404);

        // PENAMBAHAN: Validasi Update agar tidak terjadi error SQL saat menyimpan
        $request->validate([
            'name' => 'required|string|max:255',
            'code' => 'required|string|max:10|unique:branches,code,' . $id,
            'credit_price_system' => 'required|in:sama_dengan_tunai,markup_persen,turun_level',
        ]);

        try {
            $branch->update($request->all());
            return response()->json(['success' => true, 'data' => $branch], 200);
        } catch (\Exception $e) {
            return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
        }
    }

    public function destroy(Request $request, $id)
    {
        $user = $request->user();
        
        // PENAMBAHAN: Proteksi Hak Akses Pusat
        if ($user && $user->role !== 'owner') {
            return response()->json([
                'success' => false, 
                'message' => 'Akses ditolak: Hanya Owner yang berhak menghapus data cabang.'
            ], 403);
        }

        try {
            $branch = Branch::findOrFail($id);
            $branch->delete();
            return response()->json(['success' => true, 'message' => 'Cabang dihapus'], 200);
            
        } catch (QueryException $e) {
            // PROTEKSI ENTERPRISE: Mencegah penghapusan cabang yang sudah memiliki riwayat finansial
            // Jika cabang sudah terkait dengan journal_entries, branch_accounts, atau transaksi lainnya
            if ($e->getCode() == "23000") {
                return response()->json([
                    'success' => false, 
                    'message' => 'Gagal menghapus: Cabang ini sudah memiliki riwayat operasional aktif (seperti pemetaan rekening bank, transaksi, atau mutasi stok) yang terikat pada Buku Besar. Penghapusan ditolak demi menjaga integritas laporan sistem.'
                ], 400);
            }
            return response()->json(['success' => false, 'message' => 'Gagal menghapus cabang: Database Error.'], 500);
        } catch (\Exception $e) {
            return response()->json(['success' => false, 'message' => $e->getMessage()], 500);
        }
    }
}