<?php

namespace Yas\Member\Http\Controllers\Admin;

//use Illuminate\Routing\Controller;
use Webkul\Admin\Http\Controllers\Controller;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Yas\Member\DataGrids\MemberDataGrid;
use Webkul\Admin\Http\Requests\MassDestroyRequest;
use Webkul\Admin\Http\Requests\MassUpdateRequest;
use Illuminate\Http\JsonResponse;
use Yas\Member\Repositories\YasRoleRepository;
use Yas\Member\Http\Requests\MemberRequest;
use Yas\Member\Http\Requests\MemberUpdateRequest;
use Yas\Member\Repositories\MemberRepository;
use Illuminate\Support\Facades\Mail;
use Yas\Member\Mail\RegistrationNotification;
use Illuminate\Support\Str;
use Config;
use Yas\Core\Handler\Log;

class MemberController extends Controller
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct(
        protected YasRoleRepository $yasRoleRepository,
        protected MemberRepository $memberRepository,
        protected Log $log,
    ) {}

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\View\View
     */
    public function index()
    {
        if (request()->ajax()) {
            return datagrid(MemberDataGrid::class)->process();
        }
        return view('yas_member::admin.member.index');
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\View\View
     */
    public function create()
    {
        $yasroles = $this->yasRoleRepository->all();
        
        return view('yas_member::admin.member.create', compact('yasroles'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function store(MemberRequest $request)
    {
        $params = $request->all();
        if (empty($params['phone'])) {
            $params['phone'] = null;
        }

        if (empty($params['date_of_birth'])) {
            $params['date_of_birth'] = null;
        }

        $params['password'] = bcrypt($params['password']);
        $data = [
            'api_token'        => Str::random(80),
            //'is_verified'      => ! core()->getConfigData('customer.settings.email.verification'),
            'is_verified'      => 1,
            'token'            => md5(uniqid(rand(), true)), 
        ];
        $params = array_merge($params,$data);

        $member = $this->memberRepository->create($params);

        if ((bool) core()->getConfigData('emails.general.notifications.emails.general.notifications.registration')) {
            Mail::queue(new RegistrationNotification($member));
        }
        session()->flash('success', trans('member::app.member.create-success'));

        //$this->log->generateLog('Info', "Member Created", ['member' => $member], config("member.member_general"));

        return redirect()->route('yas_admin.member.index');
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @return \Illuminate\View\View
     */
    public function edit(int $id)
    {
       
        $member = $this->memberRepository->findOrFail($id);
        $yasroles = $this->yasRoleRepository->all();
        return view('yas_member::admin.member.edit', compact('member','yasroles'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function update(MemberUpdateRequest $request,int $id)
    {
        
        $params = $request->all();
        if (empty($params['phone'])) {
            $params['phone'] = null;
        }

        if (empty($params['date_of_birth'])) {
            $params['date_of_birth'] = null;
        }

        if (empty($params['password'])) {
            unset($params['password']);
        }else{
            $params['password'] = bcrypt($params['password']);
        }
        
        $member = $this->memberRepository->update($params, $id);

        session()->flash('success', trans('member::app.member.update-success'));

        //$this->log->generateLog('Info', "Member Updated", ['member' => $member], config("member.member_general"));

        return redirect()->route('yas_admin.member.index');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function destroy(int $id): JsonResponse
    {
        $member = $this->memberRepository->findOrFail($id);

        try {
            
            $member->delete($id);
            return new JsonResponse([
                'message' => trans('member::app.member.delete-success'),
            ]);
        } catch (\Exception $e) {
            return new JsonResponse([
                'message' => trans('member::app.member.delete-failed'),
            ], 500);
        }
    }

     /**
     * Get all the searched yasrole.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function search()
    {
        $members = $this->memberRepository->getAll([
            'name'   => request()->input('query'),
        ]);

        return response()->json($members);
    }

     /**
     * Remove the specified resources from database.
     */
    public function massDestroy(MassDestroyRequest $massDestroyRequest): JsonResponse
    {
        $suppressFlash = true;

        $memberIds = $massDestroyRequest->input('indices');

        foreach ($memberIds as $memberId) {
            $member = $this->memberRepository->find($memberId);

            if (isset($member)) {
                try {
                    $suppressFlash = true;
                    $this->memberRepository->delete($memberId);
                } catch (\Exception $e) {
                    return new JsonResponse([
                        'message' => trans('member::app.member.delete-failed'),
                    ], 500);
                }
            }
        }

        if (
            count($memberIds) != 1
            || $suppressFlash == true
        ) {
            return new JsonResponse([
                'message' => trans('member::app.member.mass-delete-success'),
            ]);
        }

        return redirect()->route('yas_admin.member.index');
    }
}
