<?php

namespace App\Http\Controllers\Backoffice;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\PermissionGroup;
use App\Models\ActivityLog;
use Illuminate\Support\Facades\DB;

class PermissionGroupController extends Controller
{
    public function index(Request $request)
    {
        if ($request->ajax()) {
            $groups = PermissionGroup::withCount('users')->orderBy('created_at', 'desc')->get();

            return response()->json([
                'data' => $groups->map(function($group) {
                    return [
                        'id' => $group->id,
                        'name' => $group->name,
                        'description' => $group->description,
                        'users_count' => $group->users_count,
                        'created_at' => $group->created_at->format('d.m.Y H:i'),
                    ];
                })
            ]);
        }

        return view('backoffice.permissions.index');
    }

    public function store(Request $request)
    {
        \Log::info('Store request data:', $request->all());

        $request->validate([
            'name' => 'required|string|max:255|unique:permission_groups,name',
            'description' => 'nullable|string',
            'permissions' => 'required|array',
            'bypass_ip_auth' => 'nullable|boolean',
        ], [
            'name.required' => 'Grup adı gereklidir.',
            'name.unique' => 'Bu grup adı zaten kullanılıyor.',
            'permissions.required' => 'En az bir yetki seçilmelidir.',
        ]);

        DB::beginTransaction();
        try {
            $group = PermissionGroup::create([
                'name' => $request->name,
                'description' => $request->description,
                'permissions' => $request->permissions,
                'bypass_ip_auth' => (bool) $request->bypass_ip_auth,
            ]);

            ActivityLog::log(
                'create_permission_group',
                'permission_groups',
                "Yetki grubu oluşturuldu: {$group->name}",
                null,
                $group->toArray()
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Yetki grubu başarıyla oluşturuldu.',
            ]);

        } catch (\Exception $e) {
            DB::rollBack();
            \Log::error('Store error:', ['message' => $e->getMessage(), 'trace' => $e->getTraceAsString()]);
            return response()->json([
                'success' => false,
                'message' => 'Yetki grubu oluşturulurken bir hata oluştu: ' . $e->getMessage(),
            ], 500);
        }
    }

    public function show($id)
    {
        $group = PermissionGroup::findOrFail($id);
        return response()->json(['success' => true, 'group' => $group]);
    }

    public function clone(Request $request, $id)
    {
        $sourceGroup = PermissionGroup::findOrFail($id);

        $request->validate([
            'name' => 'required|string|max:255|unique:permission_groups,name',
            'description' => 'nullable|string',
        ], [
            'name.required' => 'Grup adi gereklidir.',
            'name.unique' => 'Bu grup adi zaten kullaniliyor.',
        ]);

        DB::beginTransaction();
        try {
            $clonedGroup = PermissionGroup::create([
                'name' => $request->name,
                'description' => $request->description,
                'permissions' => $sourceGroup->permissions ?? [],
                'bypass_ip_auth' => (bool) $sourceGroup->bypass_ip_auth,
                'created_by' => auth()->id(),
            ]);

            ActivityLog::log(
                'clone_permission_group',
                'permission_groups',
                "Yetki grubu kopyalandi: {$sourceGroup->name} -> {$clonedGroup->name}",
                $sourceGroup->toArray(),
                $clonedGroup->toArray()
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Yetki grubu basariyla kopyalandi.',
                'group' => $clonedGroup,
            ]);
        } catch (\Exception $e) {
            DB::rollBack();

            return response()->json([
                'success' => false,
                'message' => 'Yetki grubu kopyalanirken bir hata olustu: ' . $e->getMessage(),
            ], 500);
        }
    }

    public function update(Request $request, $id)
    {
        \Log::info('Update request data:', ['id' => $id, 'data' => $request->all()]);

        $group = PermissionGroup::findOrFail($id);

        $request->validate([
            'name' => 'required|string|max:255|unique:permission_groups,name,' . $id,
            'description' => 'nullable|string',
            'permissions' => 'required|array',
            'bypass_ip_auth' => 'nullable|boolean',
        ]);

        DB::beginTransaction();
        try {
            $oldData = $group->toArray();

            $group->update([
                'name' => $request->name,
                'description' => $request->description,
                'permissions' => $request->permissions,
                'bypass_ip_auth' => (bool) $request->bypass_ip_auth,
            ]);

            ActivityLog::log(
                'update_permission_group',
                'permission_groups',
                "Yetki grubu güncellendi: {$group->name}",
                $oldData,
                $group->toArray()
            );

            DB::commit();

            \Log::info('Update success:', ['group' => $group->toArray()]);

            return response()->json([
                'success' => true,
                'message' => 'Yetki grubu başarıyla güncellendi.',
            ]);

        } catch (\Exception $e) {
            DB::rollBack();
            \Log::error('Update error:', ['message' => $e->getMessage(), 'trace' => $e->getTraceAsString()]);
            return response()->json([
                'success' => false,
                'message' => 'Yetki grubu güncellenirken bir hata oluştu: ' . $e->getMessage(),
            ], 500);
        }
    }

    public function destroy($id)
    {
        $group = PermissionGroup::withCount('users')->findOrFail($id);

        if ($group->users_count > 0) {
            return response()->json([
                'success' => false,
                'message' => "Bu yetki grubuna ait {$group->users_count} kullanıcı var. Önce kullanıcıları farklı bir gruba taşıyın.",
            ], 400);
        }

        DB::beginTransaction();
        try {
            $name = $group->name;
            $group->delete();

            ActivityLog::log(
                'delete_permission_group',
                'permission_groups',
                "Yetki grubu silindi: {$name}",
                $group->toArray(),
                null
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Yetki grubu başarıyla silindi.',
            ]);

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'success' => false,
                'message' => 'Yetki grubu silinirken bir hata oluştu: ' . $e->getMessage(),
            ], 500);
        }
    }
}
