<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Models\Role;
use App\Models\Department;
use App\Models\DeleteLog;
use App\Models\UserWarehouse;
use App\Models\UserCoa;
use App\Models\Coa;
use App\Models\Warehouse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;

class UserController extends Controller
{
    public function index()
    {
        try {
            $users = User::with('userWarehouse','userCoa')->get();
            $roles = Role::all();
            $coas = Coa::all();
            $department = Department::all();
            $warehouse = Warehouse::all();
            return response()->json(["users" => $users,"roles" => $roles, "department" => $department, "warehouse" => $warehouse,"coas"=>$coas,"role" => $this->getRole()]);
        } catch (\Exception $e) {
            Log::error('Failed to fetch users', ['error' => $e->getMessage()]);
            return response()->json(['error' => 'Failed to fetch users.'], 500);
        }
    }

    public function store(Request $request)
    {
        try {
            $user = User::create([
                'name' => $request->name,
                'username' => $request->username,
                'email' => $request->email,
                'role' => $request->role,
                'default_department_id' => json_encode($request->default_department_id),
                'password' => bcrypt($request->password),
            ]);
            if($request->filled('user_warehouse')){
                foreach($request->user_warehouse as $wh){
                        UserWarehouse::create([
                        'user_id' => $user->id,
                        'warehouse_id' => $wh['warehouse_id']
                    ]);
                }
            }
            if($request->filled('user_coa')){
                foreach($request->user_coa as $coa){
                        UserCoa::create([
                        'user_id' => $user->id,
                        'coa_id' => $coa['coa_id']
                    ]);
                }
            }
            return response()->json($user, 201);
        } catch (ValidationException $e) {
            Log::warning('Validation failed on user creation', ['errors' => $e->errors()]);
            return response()->json(['error' => $e->errors()], 422);
        } catch (\Exception $e) {
            Log::error('Failed to create user', ['error' => $e->getMessage()]);
            return response()->json(['error' => 'Failed to create user.'], 500);
        }
    }

    public function show($id)
    {
        try {
            $user = User::findOrFail($id);
            return response()->json($user);
        } catch (\Exception $e) {
            Log::error('Failed to fetch user', ['user_id' => $id, 'error' => $e->getMessage()]);
            return response()->json(['error' => 'User not found.'], 404);
        }
    }

    public function update(Request $request, $id)
    {
        try {
            $user = User::findOrFail($id);
            $user->name = $request->name;
            $user->username = $request->username;
            $user->email = $request->email;
            $user->role = $request->role;
            $user->default_department_id = $request->default_department_id;

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

            if($request->filled('user_warehouse')){
                UserWarehouse::where("user_id",$id)->delete();
                foreach($request->user_warehouse as $wh){
                    UserWarehouse::create([
                        'user_id' => $user->id,
                        'warehouse_id' => $wh['warehouse_id']
                    ]);
                }
            }

            if($request->filled('user_coa')){
                UserCoa::where("user_id",$id)->delete();
                foreach($request->user_coa as $coa){
                    UserCoa::create([
                        'user_id' => $user->id,
                        'coa_id' => $coa['coa_id']
                    ]);
                }
            }

            $user->save();
            return response()->json($user);
        } catch (ValidationException $e) {
            Log::warning('Validation failed on user update', ['user_id' => $id, 'errors' => $e->errors()]);
            return response()->json(['error' => $e->errors()], 422);
        } catch (\Exception $e) {
            Log::error('Failed to update user', ['user_id' => $id, 'error' => $e->getMessage()]);
            return response()->json(['error' => 'Failed to update user.'], 500);
        }
    }

    public function destroy(Request $request, $id)
    {
        try {
            $user = User::findOrFail($id);
            UserWarehouse::where("user_id",$id)->delete();
            UserCoa::where("user_id",$id)->delete();

            DeleteLog::create([
                'document_number' => $id,
                'document_date' => now(),
                'delete_notes' => $request->delete_notes ?? 'No notes provided',
                'company_code' => null,
                'department_code' => null,
                'deleted_by' => Auth::check() ? Auth::user()->name : 'system',
                'type' => 'Master User',
            ]);

            $user->delete();
            return response()->json(null, 204);
        } catch (\Exception $e) {
            Log::error('Failed to delete user', ['user_id' => $id, 'error' => $e->getMessage()]);
            return response()->json(['error' => 'Failed to delete user.'], 500);
        }
    }
}