<?php

namespace App\Http\Controllers\Backoffice;

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

class BackofficeUserController extends Controller
{
    public function index(Request $request)
    {
        $query = User::with(['permissionGroup']);

        if ($request->filled('permission_group_id')) {
            $query->where('permission_group_id', $request->permission_group_id);
        }

        if ($request->ajax()) {
            $users = $query->orderBy('created_at', 'desc')->get();

            return response()->json([
                'data' => $users->map(function($user) {
                    return [
                        'id' => $user->id,
                        'username' => $user->username,
                        'full_name' => $user->full_name,
                        'email' => $user->email,
                        'permission_group_id' => $user->permission_group_id,
                        'permission_group_name' => $user->permissionGroup ? $user->permissionGroup->name : '-',
                        'is_active' => $user->is_active,
                        'last_login_at' => $user->last_login_at ? $user->last_login_at->format('d.m.Y H:i') : '-',
                        'created_at' => $user->created_at->format('d.m.Y H:i'),
                    ];
                })
            ]);
        }

        $permissionGroups = PermissionGroup::all();
        return view('backoffice.users.index', compact('permissionGroups'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'permission_group_id' => 'nullable|exists:permission_groups,id',
            'username' => 'required|string|max:255|unique:users,username',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|string|min:6',
            'full_name' => 'required|string|max:255',
            'is_active' => 'boolean',
        ], [
            'username.required' => 'Kullanıcı adı gereklidir.',
            'username.unique' => 'Bu kullanıcı adı zaten kullanılıyor.',
            'email.required' => 'E-posta gereklidir.',
            'email.unique' => 'Bu e-posta zaten kullanılıyor.',
            'password.required' => 'Şifre gereklidir.',
            'password.min' => 'Şifre en az 6 karakter olmalıdır.',
            'full_name.required' => 'Ad Soyad gereklidir.',
        ]);

        DB::beginTransaction();
        try {
            $user = User::create([
                'permission_group_id' => $request->permission_group_id,
                'username' => $request->username,
                'email' => $request->email,
                'password' => Hash::make($request->password),
                'full_name' => $request->full_name,
                'is_active' => $request->boolean('is_active', true),
            ]);

            ActivityLog::log(
                'create_backoffice_user',
                'users',
                "Backoffice kullanıcısı oluşturuldu: {$user->username}",
                null,
                $user->toArray()
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Backoffice kullanıcısı başarıyla oluşturuldu.',
                'user' => $user,
            ]);

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

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

    public function update(Request $request, $id)
    {
        $user = User::findOrFail($id);

        $request->validate([
            'permission_group_id' => 'nullable|exists:permission_groups,id',
            'username' => 'required|string|max:255|unique:users,username,' . $id,
            'email' => 'required|email|unique:users,email,' . $id,
            'full_name' => 'required|string|max:255',
            'password' => 'nullable|string|min:6',
            'is_active' => 'boolean',
        ]);

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

            $updateData = [
                'permission_group_id' => $request->permission_group_id,
                'username' => $request->username,
                'email' => $request->email,
                'full_name' => $request->full_name,
                'is_active' => $request->boolean('is_active'),
            ];

            if ($request->filled('password')) {
                $updateData['password'] = Hash::make($request->password);
            }

            $user->update($updateData);

            ActivityLog::log(
                'update_backoffice_user',
                'users',
                "Backoffice kullanıcısı güncellendi: {$user->username}",
                $oldData,
                $user->toArray()
            );

            DB::commit();

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

        } catch (\Exception $e) {
            DB::rollBack();
            return response()->json([
                'success' => false,
                'message' => 'Kullanıcı güncellenirken bir hata oluştu: ' . $e->getMessage(),
            ], 500);
        }
    }

    public function destroy($id)
    {
        $user = User::findOrFail($id);

        // Prevent deleting own account
        if ($user->id === auth()->id()) {
            return response()->json([
                'success' => false,
                'message' => 'Kendi hesabınızı silemezsiniz.',
            ], 400);
        }

        DB::beginTransaction();
        try {
            $username = $user->username;
            $user->delete();

            ActivityLog::log(
                'delete_backoffice_user',
                'users',
                "Backoffice kullanıcısı silindi: {$username}",
                $user->toArray(),
                null
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Backoffice kullanıcısı başarıyla silindi.',
            ]);

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

    public function toggleStatus($id)
    {
        $user = User::findOrFail($id);

        // Prevent deactivating own account
        if ($user->id === auth()->id()) {
            return response()->json([
                'success' => false,
                'message' => 'Kendi hesabınızın durumunu değiştiremezsiniz.',
            ], 400);
        }

        DB::beginTransaction();
        try {
            $oldStatus = $user->is_active;
            $user->update(['is_active' => !$oldStatus]);

            ActivityLog::log(
                'toggle_backoffice_user_status',
                'users',
                "Backoffice kullanıcısı durumu değiştirildi: {$user->username}",
                ['is_active' => $oldStatus],
                ['is_active' => $user->is_active]
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => $user->is_active ? 'Kullanıcı aktif edildi.' : 'Kullanıcı pasif edildi.',
            ]);

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