<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Support\ValidationRule;
use App\Models\Admin\User;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redirect;

class UserController extends Controller
{
    public function index(){
        $user = User::query()->get();

        $data = [
            'user' => $user
        ];
        return view('Admin.User.index', $data);
    }

    public function store(Request $request){
        $rule = [
            'name' => 'required|string',
            'email' => 'required|email:rfc,dns',
            'password' => 'required|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/|min:8',
        ];

        $request->validate($rule, ValidationRule::getErrorMessage($rule));

        DB::beginTransaction();

        try{
            $user = [
                'name' => strip_tags($request->name),
                'email' => strip_tags($request->email),
                'password' => Hash::make(strip_tags($request->password)),
            ];

            User::query()->create($user);

            DB::commit();

            return Redirect::route('user.index')
                ->with('success', 'User berhasil ditambahkan');
        }
        catch(Exception $e){
            Log::error($e);
            DB::rollBack();

            return Redirect::route('user.index')
                ->with('error', 'User gagal ditambahkan');
        }
    }

    public function update(Request $request, $id){
        $rule = [
            'name' => 'required|string',
            'email' => 'required|email:rfc,dns',
            'passwordbaru' => 'required|regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$/|min:8',
            'passwordlama' => 'required|string'
        ];

        $request->validate($rule, ValidationRule::getErrorMessage($rule));

        DB::beginTransaction();

        try{
            $id = decrypt($id);
            $passwordbaru = Hash::make(strip_tags($request->passwordbaru));
            $passwordlama = strip_tags($request->passwordlama);

            $oldpassword = User::where('id', $id)->first();

            if (Hash::check($passwordlama, $oldpassword->password)) {
                // Passwords match
                $user = [
                    'name' => strip_tags($request->name),
                    'email' => strip_tags($request->email),
                    'password' => $passwordbaru
                ];

                User::where('id', $id)->update($user);

                DB::commit();

                return Redirect::route('user.index')
                    ->with('success', 'User berhasil diupdate');
            } else {
                // Passwords do not match
                return Redirect::route('user.index')
                    ->with('error', 'Password lama yang dimasukkan salah');
            }
        }
        catch(Exception $e){
            Log::error($e);
            DB::rollBack();

            return Redirect::route('user.index')
                ->with('error', 'User gagal diupdate');
        }
    }

    public function destroy($id) {
        $id = decrypt($id);

        DB::beginTransaction();

        try{
            User::where('id', $id)->delete();

            DB::commit();

            return Redirect::route('user.index')
                ->with('success', 'User berhasil dihapus');
        }
        catch(Exception $e){
            Log::error($e);
            DB::rollBack();

            return Redirect::route('user.index')
                ->with('error', 'User gagal dihapus');
        }
    }
}