<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\StoreUserRequest;
use App\Http\Requests\UpdateUserRequest;
use App\Http\Resources\UserResource;
use App\Models\Task;
use App\Models\User;
use App\Services\WorkloadService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class UserController extends Controller
{
    public function __construct(protected WorkloadService $workloadService) {}

    public function index(Request $request): JsonResponse
    {
        try {
            $query = User::with(['roles.permissions', 'dept', 'departments']);

            if ($request->filled('search')) {
                $search = $request->search;
                $query->where(function ($q) use ($search) {
                    $q->where('name', 'like', "%{$search}%")
                        ->orWhere('email', 'like', "%{$search}%");
                });
            }

            $perPage = min((int) $request->input('per_page', 15), 100);
            $sortBy = in_array($request->input('sort_by'), ['id', 'name', 'email', 'status', 'created_at', 'updated_at'], true)
                ? $request->input('sort_by')
                : 'created_at';
            $sortDir = $request->input('sort_dir') === 'asc' ? 'asc' : 'desc';
            $users = $query->orderBy($sortBy, $sortDir)->paginate($perPage);

            return response()->json([
                'success' => true,
                'data' => UserResource::collection($users),
                'meta' => [
                    'current_page' => $users->currentPage(),
                    'last_page' => $users->lastPage(),
                    'per_page' => $users->perPage(),
                    'total' => $users->total(),
                ],
                'message' => 'لیست کاربران',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در دریافت لیست کاربران',
            ], 500);
        }
    }

    public function show(User $user): JsonResponse
    {
        try {
            $user->load(['roles.permissions', 'projects', 'dept', 'departments']);

            return response()->json([
                'success' => true,
                'data' => new UserResource($user),
                'message' => 'اطلاعات کاربر',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در دریافت اطلاعات کاربر',
            ], 500);
        }
    }

    public function store(StoreUserRequest $request): JsonResponse
    {
        try {
            $data = $request->validated();
            $data['password'] = Hash::make($data['password']);
            $data['status'] = $data['status'] ?? 'active';
            $user = User::create($data);
            if (array_key_exists('role_id', $data)) {
                $data['role_id'] ? $user->roles()->sync([$data['role_id']]) : $user->roles()->detach();
            }
            $user->load(['role', 'roles.permissions', 'dept']);

            return response()->json([
                'success' => true,
                'data' => new UserResource($user),
                'message' => 'کاربر با موفقیت ایجاد شد',
            ], 201);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در ایجاد کاربر',
            ], 500);
        }
    }

    public function update(UpdateUserRequest $request, User $user): JsonResponse
    {
        try {
            $data = $request->validated();
            if (! empty($data['password'])) {
                $data['password'] = Hash::make($data['password']);
            } else {
                unset($data['password']);
            }
            $user->update($data);
            if (! empty($data['role_id'])) {
                $user->roles()->sync([$data['role_id']]);
            }
            $user->load(['role', 'roles.permissions']);

            return response()->json([
                'success' => true,
                'data' => new UserResource($user->fresh()),
                'message' => 'کاربر با موفقیت به‌روزرسانی شد',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در به‌روزرسانی کاربر',
            ], 500);
        }
    }

    public function destroy(User $user): JsonResponse
    {
        try {
            if ($user->id === request()->user()->id) {
                return response()->json([
                    'success' => false,
                    'message' => 'نمی‌توانید خودتان را حذف کنید',
                ], 400);
            }

            $user->delete();

            return response()->json([
                'success' => true,
                'message' => 'کاربر با موفقیت حذف شد',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در حذف کاربر',
            ], 500);
        }
    }

    public function updateStatus(Request $request, User $user): JsonResponse
    {
        try {
            $request->validate(['status' => 'required|string|in:active,inactive']);
            $user->update(['status' => $request->status]);

            return response()->json([
                'success' => true,
                'data' => new UserResource($user->fresh()),
                'message' => 'وضعیت کاربر به‌روزرسانی شد',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در به‌روزرسانی وضعیت',
            ], 500);
        }
    }

    public function syncRoles(Request $request, User $user): JsonResponse
    {
        try {
            $request->validate([
                'roles' => 'present|array',
                'roles.*' => 'integer|exists:roles,id',
            ]);

            $user->roles()->sync($request->roles);
            $user->load(['roles.permissions', 'dept', 'departments']);

            return response()->json([
                'success' => true,
                'data' => new UserResource($user),
                'message' => 'نقش‌های کاربر به‌روزرسانی شد',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در به‌روزرسانی نقش‌های کاربر',
            ], 500);
        }
    }

    public function updateWorkload(User $user): JsonResponse
    {
        try {
            $workload = collect($this->workloadService->getWorkload())
                ->firstWhere('user_id', $user->id);

            return response()->json([
                'success' => true,
                'data' => $workload,
                'message' => 'بار کاری کاربر',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در دریافت بار کاری',
            ], 500);
        }
    }

    public function taskStats(User $user): JsonResponse
    {
        try {
            $tasks = Task::where('assignee_id', $user->id);

            return response()->json([
                'success' => true,
                'data' => [
                    'assigned_tasks_count' => (clone $tasks)->count(),
                    'in_progress_count' => (clone $tasks)->whereNotIn('status', ['done', 'canceled'])->count(),
                    'delayed_tasks_count' => (clone $tasks)->whereDate('due_date', '<', now()->toDateString())->where('status', '!=', 'done')->count(),
                ],
                'message' => 'آمار تسک‌های کاربر',
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'success' => false,
                'message' => 'خطا در دریافت آمار کاربر',
            ], 500);
        }
    }
}
