<?php

namespace App\Http\Controllers\Backend\Auth\User;

use App\Events\Backend\Auth\User\UserDeleted;
use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\Auth\User\ManageUserRequest;
use App\Http\Requests\Backend\Auth\User\StoreUserRequest;
use App\Http\Requests\Backend\Auth\User\UpdateUserRequest;
use App\Models\Auth\User;
use App\Models\Lookups\Stripe_plans;
use App\Repositories\Backend\Auth\PermissionRepository;
use App\Repositories\Backend\Auth\RoleRepository;
use App\Repositories\Backend\Auth\UserRepository;
use Illuminate\Http\Request;
use Stripe\PromotionCode;
use Stripe\Stripe;

/**
 * Class UserController.
 */
class UserController extends Controller
{
    /**
     * @var UserRepository
     */
    protected $userRepository;

    /**
     * UserController constructor.
     *
     * @param UserRepository $userRepository
     */
    public function __construct(UserRepository $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    /**
     * @param ManageUserRequest $request
     *
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function index(ManageUserRequest $request)
    {
//        if (isset($request['search'])) {
//            $users = Clipart::where('name', 'like', "%{$request['search']}%")
//                ->orWhere('description', 'LIKE', "%{$request['search']}%")
//                ->orWhere('citations', 'LIKE', "%{$request['search']}%")->paginate(20);
//        } else {
//
//            $clipart = Clipart::paginate(20);
//        }

        return view('backend.auth.user.index')
            ->withUsers($this->userRepository->getActivePaginated(50, 'id', 'asc', $request['search']));
    }

    /**
     * @param ManageUserRequest $request
     * @param RoleRepository $roleRepository
     * @param PermissionRepository $permissionRepository
     *
     * @return mixed
     */
    public function create(ManageUserRequest $request, RoleRepository $roleRepository, PermissionRepository $permissionRepository)
    {
        return view('backend.auth.user.create')
            ->withRoles($roleRepository->with('permissions')->get(['id', 'name']))
            ->withPermissions($permissionRepository->get(['id', 'name']));
    }

    /**
     * @param StoreUserRequest $request
     *
     * @return mixed
     * @throws \Throwable
     */
    public function store(StoreUserRequest $request)
    {
        $this->userRepository->create($request->only(
            'first_name',
            'last_name',
            'email',
            'password',
            'active',
            'confirmed',
            'confirmation_email',
            'roles',
            'permissions'
        ));

        return redirect()->route('admin.auth.user.index')->withFlashSuccess(__('alerts.backend.users.created'));
    }

    /**
     * @param ManageUserRequest $request
     * @param User $user
     *
     * @return mixed
     */
    public function show(ManageUserRequest $request, User $user)
    {

        return view('backend.auth.user.show')
            ->withUser($user);

    }

    /**
     * @param ManageUserRequest $request
     * @param RoleRepository $roleRepository
     * @param PermissionRepository $permissionRepository
     * @param User $user
     *
     * @return mixed
     */
    public function edit(ManageUserRequest $request, RoleRepository $roleRepository, PermissionRepository $permissionRepository, User $user)
    {
        return view('backend.auth.user.edit')
            ->withUser($user)
            ->withRoles($roleRepository->get())
            ->withUserRoles($user->roles->pluck('name')->all())
            ->withPermissions($permissionRepository->get(['id', 'name']))
            ->withUserPermissions($user->permissions->pluck('name')->all());
    }

    /**
     * @param UpdateUserRequest $request
     * @param User $user
     *
     * @return mixed
     * @throws \Throwable
     * @throws \App\Exceptions\GeneralException
     */
    public function update(UpdateUserRequest $request, User $user)
    {
        $this->userRepository->update($user, $request->only(
            'first_name',
            'last_name',
            'email',
            'roles',
            'permissions'
        ));

        return redirect()->route('admin.auth.user.index')->withFlashSuccess(__('alerts.backend.users.updated'));
    }

    /**
     * @param ManageUserRequest $request
     * @param User $user
     *
     * @return mixed
     * @throws \Exception
     */
    public function destroy(ManageUserRequest $request, User $user)
    {
        $this->userRepository->deleteById($user->id);

        event(new UserDeleted($user));

        return redirect()->route('admin.auth.user.deleted')->withFlashSuccess(__('alerts.backend.users.deleted'));
    }

    public function sneakyregister(ManageUserRequest $request, User $user)
    {
        $plans = Stripe_plans::whereNull('archived');
        return view('backend.auth.user.registration')
            ->withUser($user)
            ->withPlans($plans);
    }

    public function applySneakyRegistration(Request $request, User $user)
    {
        //dd($request['plan']);

        // The plan
        $plan = Stripe_plans::find($request['plan']);

      //  dd($plan);
// the user
        $user = User::find($user->id);
        //dd(count($user->current_active_subscriptions));

        // attempt a subscription.


        try {
            \Stripe\Stripe::setApiKey(\Config::get('cashier.secret'));

            if (count($user->current_active_subscriptions) < 1) {
                // first, validate the voucher
                $code = $request['voucher'];
                try {
                    $promoCodes = \Cache::remember('stripe-cache-promocodes', 600, function () {
                        Stripe::setApiKey(\Config::get('cashier.secret'));
                        return PromotionCode::all(["active" => true]);
                    });
                    foreach ($promoCodes->data as $promoCode) {
                        // dd($code);
                        //dd($promoCode->coupon->id);
                        if ($code == $promoCode->coupon->id) {
                            // valid
                            if ($promoCode->coupon->valid) {
                                // check that it's in fact 100% off...
                                if ($promoCode->coupon->percent_off < 100) {
                                    return redirect()->route('admin.auth.user.account.sneakyregister', $user)->withFlashDanger('Voucher needs to be 100% off');
                                }
                                // apply the voucher
                                $stripeCustomer = $user->createOrGetStripeCustomer();
                                $subscription = \Stripe\Subscription::create([
                                    'customer' => $stripeCustomer,
                                    'items' => [['price' => $plan->stripe_plan]],
                                    'coupon' => $request['voucher'],
                                ]);
                                return redirect()->route('admin.auth.user.index')->withFlashSuccess(__('alerts.backend.users.updated'));
                                // all good, keep going
                            } else {
                                // vopucher is not valid
                                return redirect()->route('admin.auth.user.account.sneakyregister', $user)->withFlashDanger('Voucher code not valid/expired');
                            }

                        }
                    }
                    return redirect()->route('admin.auth.user.account.sneakyregister', $user)->withFlashDanger('Not a valid voucher code');
                } catch (\Exception $e) {

                    return redirect()->route('admin.auth.user.account.sneakyregister', $user)->withFlashDanger($e->getMessage());
                }


            } else {
                return redirect()->route('admin.auth.user.index')->withFlashDanger('User already has a subscription');
            }
        } catch (\Exception $e) {
//            // try it again
            //dd($e->getMessage());

            return redirect()->route('admin.auth.user.account.sneakyregister', $user)->withFlashDanger($e->getMessage());

        }
    }
}
