<?php

namespace App\Http\Controllers\Backoffice;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\FinanceUser;
use App\Models\FinanceGroup;
use App\Models\ActivityLog;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;

class FinanceUserController extends Controller
{
    public function index(Request $request)
    {
        $query = FinanceUser::with(['financeGroup', 'creator']);

        if ($request->filled('finance_group_id')) {
            $query->where('finance_group_id', $request->finance_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,
                        'finance_group_name' => $user->financeGroup ? $user->financeGroup->name : '-',
                        'finance_group_color' => $user->financeGroup ? $user->financeGroup->badge_color : null,
                        'is_active' => $user->is_active,
                        'last_login_at' => $user->last_login_at ? $user->last_login_at->format('d.m.Y H:i') : '-',
                        'created_by_name' => $user->creator ? $user->creator->full_name : '-',
                        'created_at' => $user->created_at->format('d.m.Y H:i'),
                    ];
                })
            ]);
        }

        $financeGroups = FinanceGroup::active()->get();
        return view('backoffice.finance-users.index', compact('financeGroups'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'finance_group_id' => 'required|exists:finance_groups,id',
            'username' => 'required|string|max:255|unique:finance_users,username',
            'email' => 'required|email|unique:finance_users,email',
            'password' => 'required|string|min:6',
            'full_name' => 'required|string|max:255',
            'is_active' => 'boolean',
        ], [
            'finance_group_id.required' => 'Finans grubu seçilmelidir.',
            '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 = FinanceUser::create([
                'finance_group_id' => $request->finance_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),
                'created_by' => auth()->id(),
            ]);

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

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Finans 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 = FinanceUser::with(['financeGroup', 'creator'])->findOrFail($id);
        return response()->json(['success' => true, 'user' => $user]);
    }

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

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

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

            $updateData = [
                'finance_group_id' => $request->finance_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_finance_user',
                'finance_users',
                "Finans kullanıcısı güncellendi: {$user->username}",
                $oldData,
                $user->toArray()
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Finans 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 = FinanceUser::findOrFail($id);

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

            ActivityLog::log(
                'delete_finance_user',
                'finance_users',
                "Finans kullanıcısı silindi: {$username}",
                $user->toArray(),
                null
            );

            DB::commit();

            return response()->json([
                'success' => true,
                'message' => 'Finans 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 = FinanceUser::findOrFail($id);

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

            ActivityLog::log(
                'toggle_finance_user_status',
                'finance_users',
                "Finans 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);
        }
    }
}
