<?php

namespace App\Http\Controllers\Api\v1;

use Illuminate\Http\Request;
use App\SubscriptionPlans;
use App\ManagerPlan;
use App\User;
use App\Manager;
use App\EmailTemplate;
use App\Employee;
use App\UserCoupon;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use App\EmailQueue;
use App\Organization;
use App\Branch;
use Auth;
/**
 * SubscriptionPlanController Class Doc Comment
 *
 * @category Class
 * @package  Api
 * @author   Ketan Patel - ketan.patel@brainvire.com
 *
 */
class SubscriptionPlanController extends Controller
{

    public function __construct()
    {
        //$this->middleware('oauth', ['except' => ['index']]);
        //$this->middleware('auth:api', ['except' => ['index']]);
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $plans = DB::table('subscription_plans')->orderBy('id', 'desc')->get();
        return response()->json($plans);
    }

    /**
     * Get the specified resource from storage.
     *
     * @return \Illuminate\Http\Response
     */
    /**
     * Get the specified resource from storage.
     *
     * @return \Illuminate\Http\Response
     */
    public function show(Request $request)
    {
        $this->validate($request, [
            'manager_id' => 'required',
        ]);

        $planId = $request->plan_id;
        $managerId = $request->manager_id;
        $achBankVerified = 0;

        $userinfo = DB::table('users as u')
        ->select('u.id', 'u.name','u.passcode', 'u.email', 'u.mobile', 'u.created_at', 'u.status', 'u.is_sycle_profile',  'u.is_auto_renew')
        ->where('u.id', '=', $managerId)
        ->get()->first();
        $urDate = new \DateTime($userinfo->created_at);
        $userinfo->created_at = $urDate->format(env('DATE_FORMAT').' '.env('TIME_FORMAT'));   
        $planData = $planId ? SubscriptionPlans::find($planId) : array();
        $hasPlan = 0;
        $discount = 0;
        $noOfUsers = '';
        $hPlans = array();
        $stripeCustId = '';
        $planActivation = $planExpireOn = $planName = $planPrice = $validity = '';
        $currentPlanData = array();
        if (!empty($userinfo)) {
            $plan = ManagerPlan::where('manager_id', $managerId)->get()->where('status', 'current')->first();
            if (!empty($plan)) {
                $planId = $plan->plan_id;
                // $actDate = new \DateTime($plan->activated_at);
                // $planActivation = $actDate->format(env('DATE_FORMAT'));
                $planActivation = date("m-d-Y", strtotime($plan->activated_at));
                // $expDate = new \DateTime($plan->expire_on);
                // $planExpireOn = $expDate->format(env('DATE_FORMAT'));
                $planExpireOn = date("m-d-Y", strtotime($plan->expire_on));
                $planInfo = SubscriptionPlans::where('id', $planId)->get()->first();

                if (!empty($planInfo)) {
                    $hasPlan = 1;
                    $discount = $plan->promo_discount;
                    $planName = $planInfo->name;
                    $planPrice = $planInfo->price;
                    $validity = $planInfo->validity;
                    $noOfUsers = $planInfo->no_of_users;
                }

                $organization = Organization::where('user_id',$managerId)->first();
                $location = DB::table('branches')->select('id', 'name', 'organization_id', 'place_value AS place_id', 'sycle_clinic_id', 'created', 'updated')->where('organization_id', $organization->id)->orderBy('id', 'asc')->get();

                $currentPlanData = array(
                    'id' => $planId,
                    'hasPlan' => $hasPlan,
                    'validity' => $validity,
                    'final_price' => $plan->final_price,
                    'promo_discount' => $plan->promo_discount,
                    'plan_name' => $planName,
                    'plan_price' => $planPrice,
                    'plan_activation' => $planActivation,
                    'plan_expire_on' => $planExpireOn,
                    'no_of_users' => $noOfUsers,
                    'location' => $location
                );
            }

            $userinfo->user_plan_id = $planId;
            
            $manager = Manager::where('user_id', $managerId)->first();
            if($manager){
                $stripeCustId = $manager->stripe_cust_id;
                if (!empty($plan)) {
                    $achBankVerified = $manager->ach_bank_verified;
                }
            }
            

            $plans = ManagerPlan::select('manager_plans.*', 'user_coupon.coupon_code')->leftjoin('user_coupon','user_coupon.id','manager_plans.coupon_id')->where('manager_id', $managerId)->where('manager_plans.status', '!=', 'current')->get();
            
            foreach ($plans as $k => $v) {
                $info = SubscriptionPlans::where('id', $v->plan_id)->get()->first();
                if (!empty($info)) {
                    $hPlans[$k]['validity']   = $info->validity;
                    $hPlans[$k]['plan_name']  = $info->name;
                    $hPlans[$k]['plan_price'] = $info->price;
                    //$hPlans[$k]['discount']   = $v->discount;
                    $hPlans[$k]['final_price'] = $v->final_price;
                    $hPlans[$k]['promo_discount'] = $v->promo_discount;
                    $histActdate = new \DateTime($v->activated_at);
                    $hplActivation = $histActdate->format(env('DATE_FORMAT'));
                    $hPlans[$k]['plan_activation'] = $hplActivation;
                    
                    $histExpdate                  = new \DateTime($v->expire_on);
                    $hplExpireOn                  = $histExpdate->format(env('DATE_FORMAT'));
                    $hPlans[$k]['plan_expire_on'] = $hplExpireOn;
                    $hPlans[$k]['plan_status']    = $v->status;
                    $hPlans[$k]['no_of_users']    = $info->no_of_users;
                    $hPlans[$k]['coupon']    = $v->coupon_code;
                }
            }

            $responseArray = [
                'userInfo'          => $userinfo,
                'planData'          => $planData,
                'currentPlanData'   => $currentPlanData,
                'plansHistory'      => $hPlans,
                'ach_bank_verified' => $achBankVerified,
                'stripe_cust_id'    => $stripeCustId,
            ];
            return response()->json(['status' => 'success', 'data' => $responseArray]);
        } else {
            return response()->json(['status' => 'fail', 'message' => RECORD_NOT_FOUND]);
        }
    }


    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|unique:subscription_plans',
            'price' => 'required',
            'validity' => 'required',
            'status' => 'required',
            'noOfUsers' => 'required',
            'description'=> 'required',
        ]);
        
        $data = array();
        $data['planName'] = $request->name;
        $data['planAmount'] = $request->price;
        $data['planValidity'] = $request->validity;
        $planId = $this->createPlan($data);
        if ($planId) {
            $plan = new SubscriptionPlans();
            $plan->name = $data['planName'];
            $plan->price = $data['planAmount'];
            $plan->validity = $data['planValidity'];
            $plan->status = $request->status;
            $plan->no_of_users = $request->noOfUsers;
            $plan->description = $request->description;
            if ($request->input('recommended')===true) {
                $allPlans = SubscriptionPlans::all();
                foreach ($allPlans as $value) {
                    $value->isRecommended = '0';
                    $value->save();
                }
                $plan->isRecommended = '1';
            } 
            $date = new \DateTime();
            $ddf = $date->format('Y-m-d');
            $plan->created = $ddf;
            $plan->stripe_plan_id = $planId;
            $plan->save();
            
            
            /*---- Subadmin activity log ---*/
            $subAdminName           = $request->subAdminName;
            $subAdminId             = $request->subAdminId;
            $logdata                = [];
            $logdata['adminName']   = $subAdminName;
            $logdata['adminUserId'] = $subAdminId;
            $logdata['type']        = 'plan';
            $logdata['description'] = "Sub Admin $subAdminName has created new plan $request->name";
            $this->logActivity($logdata);
        }

        return response()->json(['status' => 'success']);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int                      $rid
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $rid)
    {
        $this->validate($request, [
            //'name' => 'required|unique:subscription_plans,name,' . $rid,
            //'price' => 'required',
            //'validity' => 'required',
            'status' => 'required',
            'description'=> 'required',
        ]);
        
        $plan = SubscriptionPlans::find($rid);
        if (!empty($plan)) {
            if($plan->is_free_plan == 1) {
                $plan->name = $request->name;
                $plan->no_of_users = $request->noOfUsers;
            }
            
            $plan->status = $request->status;
            $date = new \DateTime();
            $ddf = $date->format('Y-m-d H:i:s');
            $plan->updated = $ddf;
            $plan->description = $request->description;
            if ($request->input('recommended')===true) {
                $allPlans = SubscriptionPlans::where('id','!=',$rid)->get();
                foreach ($allPlans as $value) {
                    $value->isRecommended = '0';
                    $value->save();
                }
                $plan->isRecommended = '1';
            } 
            $plan->save();

            return response()->json(['status' => 'success']);
        } else {
            return response()->json(['status' => 'fail']);
        }
    }

    /**
     * Create stripe plan.
     *
     */
    public function createPlan($data = array())
    {
        //return 'safjasnf';
        $this->stripeIntegration();

        if (isset($data['planAmount'])) {
            try {
                $uniqueId = substr(md5(uniqid(mt_rand(), true)), 0, 14);
                if ($data['planValidity'] == '3-month' || $data['planValidity'] == '6-month') {
                    $charge = \Stripe\Plan::create(array(
                        "amount" => isset($data['planAmount']) ? $data['planAmount'] * 100 : '',
                        "interval" => isset($data['planValidity']) ? 'month' : '',
                        "interval_count"=> $data['planValidity'] == '3-month' ? 3 : 6,
                        "name" => isset($data['planName']) ? $data['planName'] : '',
                        "currency" => "usd",
                        "id" => $uniqueId));
                } else {
                    $charge = \Stripe\Plan::create(array(
                        "amount" => isset($data['planAmount']) ? $data['planAmount'] * 100 : '',
                        "interval" => isset($data['planValidity']) ? $data['planValidity'] : '',
                        "name" => isset($data['planName']) ? $data['planName'] : '',
                        "currency" => "usd",
                        "id" => $uniqueId));
                    // Plan has created, no exceptions were thrown or otherwise caught
                }return $charge->id;
            } catch (\Stripe\Error\Card $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\InvalidRequest $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\Authentication $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\ApiConnection $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\Base $e) {
                $error = $e->getMessage();
            } catch (Exception $e) {
                $error = $e->getMessage();
            }
            return false;
        }
    }

    /**
     * Subcribed new/renew stripe paln to manager.
     *
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Http\Response
     */
    public function subscribeCustomer(Request $request)
    {

        $giveDiscount   = 0;
        $discountAmount = 0;
        $newRegister=0;
        $requstData=$request->all();
        //get stripe config params
        $this->stripeIntegration();
        $helperObj = new \App\CommonHelper();
        $this->validate($request, [
            'manager_id' => 'required',
            'plan_id' => 'required',
        ]);
        $manager = Manager::where('user_id', $request->manager_id)->get()->first();
        $oldSubscriptionIds=[];
        $subcriptionPlan = SubscriptionPlans::find($request->plan_id);
        $plan = ManagerPlan::where('manager_id', $request->manager_id)->get()->where('status', 'current')->toArray();
        if ($plan) {
            //return response()->json(['status' => 'fail', 'message' => ALREADY_PLAN]);
          $oldSubscriptionIds = $plan;
        }
        if ($subcriptionPlan->stripe_plan_id == '') {
            return response()->json(['status' => 'fail', 'message' => NOT_STRIPE_PLAN]);
        }
        
        if ($manager) {
            $errorOccurred = 0;
            $error         = '';

            try { 

                $plan  = ManagerPlan::where('manager_id', $request->manager_id)->where('plan_id', $request->plan_id)->orderBy('id','DESC')->first();
                 //for new subscription
                if (!($plan)) {
                    $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'new');
                } else {
                    //for plan renew
//                    $plan->status = 'renew';
//                    $plan->save();
                    $expiryDate = $plan->expire_on;
                    $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'new');
                    
//                    if (is_numeric($expireOn) && $expireOn > 7) {
//                        return response()->json(['status' => 'fail', 'message' => NOT_EXPIRED]);
//                    }
                }
               
                if(isset($requstData['coupon']) && $requstData['coupon'] !=""){

                    $newRegister=1;
                    $couponData=UserCoupon::select('id','percentage','coupon_used')->where('coupon_code',$requstData['coupon'])->where('status','Active')->first();
                   
                   //  if(count($couponData) == 0){
                   //     return response()->json(['status' => 'fail', 'message' => 'Please Enter Valid Coupon.']);
                   // }

                   $planCount=ManagerPlan::where('manager_id', $request->manager_id)->where('coupon_id',$couponData->id)->count();

                   if($planCount > 0){
                    return response()->json(['status' => 'fail', 'message' => 'Coupon is allready used.']);
                }

                $coupon = \Stripe\Coupon::create([
                    'duration' => 'once',
                    'id' => $request->manager_id.'_test'.$couponData->id,
                    'percent_off' => $couponData->percentage,
                ]);

                $subscription = \Stripe\Subscription::create([
                    'customer' => $manager->stripe_cust_id,
                    'items' => [['plan' => $subcriptionPlan->stripe_plan_id]],
                    'coupon' => $request->manager_id.'_live'.$couponData->id,
                    'source' => $request->token_id,
                    'collection_method' => 'charge_automatically'
                ]);

                $userCoupon['coupon_used']=$couponData->coupon_used+1;
                UserCoupon::where('id',$couponData->id)->update($userCoupon);

            }else{

                $subscription = \Stripe\Subscription::create(array(
                    "customer" => $manager->stripe_cust_id,
                    "plan" => $subcriptionPlan->stripe_plan_id,
                    "source" => $request->token_id,
                    "collection_method" => 'charge_automatically'
                ));

            }
            

        }  
        catch (\Stripe\Error\Card $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        } catch (\Stripe\Error\InvalidRequest $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        } catch (\Stripe\Error\Authentication $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        } catch (\Stripe\Error\ApiConnection $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        } catch (\Stripe\Error\Base $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        } catch (Exception $e) {
            $error = $e->getMessage();
            $errorOccurred = 1;
        }

        if ($errorOccurred === 1 ) {
            
            return response()->json(['status' => 'fail', 'message' => $error]);
        } else {
            $subId = $subscription->id;
            if(isset($subscription->latest_invoice)){
                $invoice_id = $subscription->latest_invoice;
            }else{
                $invoice_id = null;
            }
            
            
            
            
            // $plan  = ManagerPlan::where('manager_id', $request->manager_id)->get()
            // ->where('plan_id', $request->plan_id)->first();

            $mangerPlan             = new ManagerPlan();
            $mangerPlan->manager_id = $request->manager_id;
            $mangerPlan->plan_id    = $request->plan_id;
            $mangerPlan->stripe_webhook_response = $subscription;
            $objPlan            = SubscriptionPlans::find($request->plan_id);
            $mangerPlan->status = 'current';

            $isDisc     = ($request->input('isdiscount')) ? $request->isdiscount : $giveDiscount;
            $discAmount = ($request->input('discountAmount')) ? $request->discountAmount : $discountAmount;

            if ($isDisc == 1) {
                
                $planPrice = $objPlan->price - $discAmount;
                $mangerPlan->promo_discount   = $discAmount;
                $mangerPlan->final_price   = $planPrice;
                
            } else {
                $mangerPlan->final_price   = $objPlan->price;
            }

            if($newRegister ==1){
                $disPercentage=$couponData->percentage;
                $disAmount=$objPlan->price*$disPercentage/100;
                $planPrice              = $objPlan->price - $disAmount;
		$mangerPlan->promo_discount   = $disAmount;
                $mangerPlan->final_price   = $planPrice;

            }else {
                $mangerPlan->final_price   = $objPlan->price;
            }

            $mangerPlan->plan_price      = $objPlan ? $objPlan->price : '';
            $date                        = new \DateTime();
            $mangerPlan->activated_at    = $date;
            $mangerPlan->created_at      = $date->format('Y-m-d H:i:s');
            $mangerPlan->subscription_id = $subId;
            $mangerPlan->invoice_id = $invoice_id;

            //         //for new subscription
            // if (!is_object($plan)) {
            //     $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'new');
            // } else {
            //             //for plan renew
            //     $plan->status = 'renew';
            //     $plan->save();
            //     $expiryDate = $plan->expire_on;
            //     $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'renew', $expiryDate);
            //     if (is_numeric($expireOn) && $expireOn > 7) {
            //         return response()->json(['status' => 'fail', 'message' => NOT_EXPIRED]);
            //     }
            // }
                    // $manager = Manager::find($request->manager_id);
            $user = User::find($request->manager_id);
            $user->plan = $request->plan_id;
            $user->save();
            $mangerPlan->expire_on = $expireOn;
            if($newRegister ==1){
                $mangerPlan->coupon_id = $couponData->id;
            }
            $mangerPlan->save();
            
            
            $employees = Employee::all()->where('organization_id', $manager->organization_id);
            
            foreach ($employees as $emp) {
                $emp->plan_expired =  $expireOn;
                $emp->save();
            }
            
            //cancel older subscribtion if when this new subscribed .. 
            $this->cancelOlderPlanorSubscription($oldSubscriptionIds, $request->manager_id);

            $userName                = $user->name;
            $userEmail               = $user->email;
            $subcriptionPlanName     = $subcriptionPlan->name;
            $subcriptionPlanPrice    = $subcriptionPlan->price;
            $subcriptionPlanValidity = $subcriptionPlan->validity;

            if($newRegister ==1){
                /*---store plan invoice email record in mail queue----*/
                $body = EmailTemplate::where('slug', 'COUPON_PLAN_INVOICE')->first();

            }
            else{

                /*---store plan invoice email record in mail queue----*/
                $body = EmailTemplate::where('slug', 'PLAN_INVOICE')->first();

            }

            if (!empty($body)) {
                $organization = Organization::where('user_id',$user->id)->first();
                if ($organization->organization_pic !="") {
                    $helperobj = new \App\CommonHelper();
                    $docUrl = $helperobj->publicPath();
                    $image = $docUrl .'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                    if (!file_exists($image)) {
                        $image = ANGULARURL .'assets/img/PU-logo.png';
                    } else {
                        $image = url() .'/orgLogo/' .$organization->id. '/' . $organization->organization_pic;
                    }
                } else {
                 $image = ANGULARURL .'assets/img/PU-logo.png';
             }
             if($newRegister ==1){

               $tmp1 = str_replace("##USER_NAME##", $userName, $body['description']);
               $tmp2 = str_replace("##PLAN_NAME##", $subcriptionPlanName, $tmp1);
               $tmp3 = str_replace("##PLAN_PRICE##", $subcriptionPlanPrice, $tmp2);
               $tmp4 = str_replace("##COUPON_CODE##", $requstData['coupon'], $tmp3);
               $tmp5 = str_replace("##DISCOUNT_PERCENTAGE##", $couponData->percentage, $tmp4);
               $tmp6 = str_replace("##PAYABLE_AMMOUNT##",$planPrice, $tmp5);
               $tmp7 = str_replace("##PLAN_VALIDITY##", $subcriptionPlanValidity, $tmp6);
               $tmp8 = str_replace("##LOGO##", $image, $tmp7);
               $tmp9 = str_replace("##YEAR##", date('Y'), $tmp8);
               $data['html'] = str_replace("##SUPPORT_LINK##", SUPPORT_LINK, $tmp9);

           }else{

             $tmp1 = str_replace("##USER_NAME##", $userName, $body['description']);
             $tmp2 = str_replace("##PLAN_NAME##", $subcriptionPlanName, $tmp1);
             $tmp3 = str_replace("##PLAN_PRICE##", $subcriptionPlanPrice, $tmp2);
             $tmp4 = str_replace("##PLAN_VALIDITY##", $subcriptionPlanValidity, $tmp3);
             $tmp5 = str_replace("##LOGO##", $image, $tmp4);
             $tmp6 = str_replace("##YEAR##", date('Y'), $tmp5);
             $data['html'] = str_replace("##SUPPORT_LINK##", SUPPORT_LINK, $tmp6);

         }

         $subject      = $body['subject'];
         $subject      = str_replace("##USER_NAME##", $organization->name, $body['subject']);

         $emailQueue               = new EmailQueue();
         $emailQueue->type         = TYPE_PLAN_INVOICE;
         $emailQueue->mail_subject = $subject;
         $emailQueue->mail_to      = $userEmail;
         $emailQueue->mail_from    = FROM_IN_MAIL;
         $emailQueue->mail_body    = $data['html'];
         $emailQueue->is_send      = 0;
         $date                     = new \DateTime();
         $ddf                      = $date->format('Y-m-d H:i:s');
         $emailQueue->created      = $ddf;
         $emailQueue->save();
     }

                    // Plan has created, no exceptions were thrown or otherwise caught
     return response()->json(['status' => 'success', 'id' => $subId,'message'=>SUB_PLAN]);
 }
}
}

    //cancel subscription
public function cancelSubscription(Request $request)
{
        //get stripe config params
    $this->stripeIntegration();
    $this->validate($request, [
        'manager_id' => 'required',
    ]);
    
    $plan = ManagerPlan::where('manager_id', $request->manager_id)->get()->where('status', 'current')->first();
    $subscriptionId = $plan->subscription_id;
    $subscription = \Stripe\Subscription::retrieve($subscriptionId);
    $subscription->cancel();

    $plan->status = 'canceled';
    $date = new \DateTime();
    $plan->expire_on = $date->format('Y-m-d');
    $plan->save();

    return response()->json(['status' => 'success']);
}

public function cancelOlderPlanorSubscription($subscriptionId, $manager_id ) {
    
    if(!empty($subscriptionId) && !empty($manager_id)){
        foreach($subscriptionId as $key => $val){
           $plan = ManagerPlan::where([
                'manager_id'=>$manager_id,
                'subscription_id'=> $val['subscription_id'],
                'status'=>'current'
                    ])->get()->first();
            $plansData=$plan->toArray();
            $subscription = \Stripe\Subscription::retrieve($val['subscription_id']);
            $subscription->cancel();

            if($plan && count($plansData) > 0){
                $plan->status = 'canceled';
                $date = new \DateTime();
                $plan->expire_on = $date->format('Y-m-d');
                $plan->save();
            }
        }
    }
    
}

    /**
     * Remove the specified resource from storage.btok_1AgwB3GrzVSpYQimpGenqP06
     *
     * @param  int $rid
     * @return \Illuminate\Http\Response
     */
    public function destroy($rid)
    {
        if (SubscriptionPlans::destroy($rid)) {
            return response()->json(['status' => 'success']);
        }
    }

    /**
     * Change status of expired plan.
     *
     * @return \Illuminate\Http\Response
     */
    public function expiredPlan()
    {
        //get all expired plan
        $from = date('Y-m-d 00:00:00', strtotime(' -1 day'));
        $toDate = date('Y-m-d 23:59:59', strtotime(' -1 day'));

        $plans = ManagerPlan::
        where('status', 'current')
        ->whereBetween('expire_on', array($from, $toDate))->get();
        $count = $plans->count();
        $body = '<table width="100%" cellspacing="0" cellpadding="0" border="2"><tr><td colspan="5" style="text-align:center">Plan Expired Report</td></tr>';
        if ($count > 0) {
            $tab = '<tr><td>Plan Id</td><td>Manager Name</td><td>Plan Name</td><td>Price</td><td>Expired On</td></tr>';
            $body = $body . $tab;
            foreach ($plans as $plan) {
                $objPlan = SubscriptionPlans::find($plan->plan_id);
                $objUser = User::find($plan->manager_id);
                $plan->status = 'expired';
                $plan->save();
                $body = $body . '<tr><td>' . $objPlan->stripe_plan_id . '</td><td>' . $objUser->name .
                '</td><td>' . $objPlan->name . '</td><td>' . $objPlan->price . '</td><td>' . date('Y-m-d') .
                '</td></tr>';
                $body = $body . '</table>';
                $emailBody = EmailTemplate::where('slug', 'CRON_REPORT')->first();
                if (!empty($body)) {
                    $data['html'] = str_replace("##PLAN_DATA##", $body, $emailBody['description']);
                    $subject = $emailBody['subject'];
                    Mail :: send('emails.email', $data, function ($message) use ($subject) {
                        $message->from(FROM_IN_MAIL, APP_NAME_IN_MAIL);
                        $message->to('nisha.bhatt@brainvire.com');
                        $message->subject($subject);
                    });
                }
            }

            $result = response()->json(['status' => 'success', 'message' => 'Total ' . $count . ' plan expired']);
        } else {
            $result = response()->json(['status' => 'success', 'message' => 'No plan expired']);
        }

        return $result;
    }

    /**
     * Create stripe ach customer.
     *
     * @param \Illuminate\Http\Request $request
     */
    public function createACHToken(Request $request)
    {
        $this->stripeIntegration();
        $this->validate($request, [
            'manager_id' => 'required',
            'token_id'   =>'required',
            'bank_id'    =>'required',
        ]);
        $manager = Manager::where('user_id', $request->manager_id)->get()->first();
        $custId = $manager->stripe_cust_id;
        if ($custId != '') {
            try {
                $customer = \Stripe\Customer::retrieve($custId);
                $customer->sources->create(array("source" => $request->token_id));
                $customer->save();

                $manager->ach_bank_token = $request->bank_id;
                $manager->save();
                $bankId = $request->bank_id;
                return response()->json(['status' => 'success','message'=>ACCOUNT_CREATED, 'bank_id' =>$bankId ]);
            } catch (\Stripe\Error\Card $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\InvalidRequest $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\Authentication $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\ApiConnection $e) {
                $error = $e->getMessage();
            } catch (\Stripe\Error\Base $e) {
                $error = $e->getMessage();
            } catch (Exception $e) {
                $error = $e->getMessage();
            }
            return response()->json(['status' => 'fail', 'message' => $error]);

        } else {
            return response()->json(['status' => 'fail', 'message' => 'You are not stripe customer']);
        }
    }

    /**
     * Verify bank account
     *
     * @param \Illuminate\Http\Request $request
     */
    public function verifyACHCustomer(Request $request)
    {
        $this->validate($request, [
            'manager_id' => 'required',
        ]);

        $this->stripeIntegration();
        try {
            // get the existing bank account
            $manager = Manager::where('user_id', $request->manager_id)->get()->first();
            $customer = \Stripe\Customer::retrieve($manager->stripe_cust_id);
            $bankAccount = $customer->sources->retrieve($manager->ach_bank_token);

            // verify the account
            $bankAccount->verify(array('amounts' => array($request->amount_1, $request->amount_2)));
            $manager->ach_bank_verified = 1;
            $manager->save();
            return response()->json(['status' => 'success','message' => 'Account verified successfully']);
        } catch (\Stripe\Error\Card $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\InvalidRequest $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\Authentication $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\ApiConnection $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\Base $e) {
            $error = $e->getMessage();
        } catch (Exception $e) {
            $error = $e->getMessage();
        }

        return response()->json(['status' => 'fail', 'message' => $error]);
    }

    /**
     * ACH charge
     *
     * @param \Illuminate\Http\Request $request
     */
    public function achCharge(Request $request)
    {
        $this->stripeIntegration();
        $helperObj = new \App\CommonHelper();
        $manager = Manager::where('user_id', $request->manager_id)->get()->first();
        $subcriptionPlan = SubscriptionPlans::find($request->plan_id);
        $plan = ManagerPlan::where('manager_id', $request->manager_id)->get()->where('status', 'current')->first();
        if ($plan) {
            return response()->json(['status' => 'fail', 'message' => 'You have already plan']);
        }
        if ($manager->ach_bank_verified == 0) {
            return response()->json(['status' => 'fail', 'message' => 'Please verify your bank']);
        }
        $plan = ManagerPlan::where('manager_id', $request->manager_id)->get()
        ->where('plan_id', $request->plan_id)->first();
        $mangerPlan = new ManagerPlan();
        $mangerPlan->manager_id = $request->manager_id;
        $mangerPlan->plan_id = $request->plan_id;
        $mangerPlan->status = 'current';
        $date = new \DateTime();
        $mangerPlan->activated_at = $date;
        $mangerPlan->created_at = $date->format('Y-m-d H:i:s');
        
        $objPlan = SubscriptionPlans::find($request->plan_id);
        $mangerPlan->plan_price = $objPlan->price;

        //for new subscription
        if (!($plan)) {
            $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'new');
        } else {
            $expiryDate = $plan->expire_on;
            $expireOn = $helperObj->getPlanExpiryDate($request->plan_id, $mode = 'renew', $expiryDate);
            
            if (is_numeric($expireOn) && $expireOn > 7) {
                return response()->json(['status' => 'fail', 'message' => ALREADY_PLAN]);
            }
            //for plan renew
            $plan->status = 'renew';
        }
        try {
            $subscription = \Stripe\Charge::create(array(
                "amount" => str_replace(".", "", $subcriptionPlan->price),
                "currency" => "usd",
                        "customer" => $manager->stripe_cust_id // Previously stored, then retrieved
                    ));
            
            $mangerPlan->subscription_id = $subscription->id;

            $user = User::find($request->manager_id);
            $user->plan = $request->plan_id;
            $user->save();
            if ($plan) {
                $plan->save();
            }
            $mangerPlan->expire_on = $expireOn;
            $mangerPlan->save();
            $employees = Employee::all()->where('organization_id', $manager->organization_id);
            foreach ($employees as $emp) {
                $emp->plan_expired =  $expireOn;
                $emp->save();
            }
            return response()->json([
                'status' => 'success',
                'subcription' => $subscription->id,
                'message' => 'Payment done successfully'
            ]);
        } catch (\Stripe\Error\Card $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\InvalidRequest $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\Authentication $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\ApiConnection $e) {
            $error = $e->getMessage();
        } catch (\Stripe\Error\Base $e) {
            $error = $e->getMessage();
        } catch (Exception $e) {
            $error = $e->getMessage();
        }

        return response()->json(['status' => 'fail', 'message' => $error]);
    }

    /**
     * Update the status resource in storage.
     *
     * @param \Illuminate\Http\Request $request
     * @param int                      $rid
     * @return \Illuminate\Http\Response
     */
    public function changeStatus(Request $request, $rid)
    {
        $plan = SubscriptionPlans::find($rid);
        if (!empty($plan)) {
            if ($plan->status == 1) {
                $plan->status = 0;
            } else {
                $plan->status = 1;
            }
            $plan->save();

            /*---- Subadmin activity log ---*/
            $subAdminName           = $request->subAdminName;
            $subAdminId             = $request->subAdminId;
            $logdata                = [];
            $logdata['adminName']   = $subAdminName;
            $logdata['adminUserId'] = $subAdminId;
            $logdata['type']        = 'plan';
            $logdata['description'] = "Sub Admin $subAdminName has changed status of subscription plan with ID:$rid";
            $this->logActivity($logdata);
            
            return response()->json(['status' => 'success']);
        } else {
            return response()->json(['status' => 'fail']);
        }
    }
    
    public function stripeIntegration()
    {
        $helperObj = new \App\CommonHelper();
        $stripePubKey = $helperObj->stripeConfiguration();
    }
    
    public function plaidVerification(Request $request)
    {
        $manager = Manager::where('user_id', $request->manager_id)->get()->first();
        $helperObj = new \App\CommonHelper();
        $result = $helperObj->plaidIntegration($request->public_token,$request->account_id);
        if($result){
            $btok_parsed = json_decode($result);
            $this->createBankToken($btok_parsed->stripe_bank_account_token,$manager);
            return response()->json([
                'status' => 'success',
                'message' => 'Bank verification done successfully.'
            ]);
        }else{
            return response()->json(['status' => 'fail', 'message' => SOMETHING_WENT_WRONG]);
        }
    }
    /**
     * Bank verification.
     *
     * @param \Illuminate\Http\Request $request
     */
    public function createBankToken($bankToken,$manager)
    {
        $this->stripeIntegration();
        $customer = \Stripe\Customer::retrieve($manager->stripe_cust_id);
        $customer->sources->create(array("source" => $bankToken));
        $customer->save();
        $manager->ach_bank_verified = 1;
        $manager->save();
        
        return true;
    }

    public function getSycleUserPlanProfileDetails()
    {
        $currentUser = app('auth')->guard()->user();
        $sycleFreePlanArr = array();
        $sycleFreePlanQry = DB::table('subscription_plans')
            ->select('subscription_plans.*','manager_plans.activated_at', 'manager_plans.expire_on')
            ->leftJoin('manager_plans', 'manager_plans.plan_id', '=', 'subscription_plans.id')
            ->where('manager_id', $currentUser->id)
            ->where('manager_plans.status', 'current')->get();

        foreach ($sycleFreePlanQry as $key => $value) {
           $sycleFreePlanArr = $value;
           $sycleFreePlanArr->activated_at = date("m-d-Y", strtotime($value->activated_at));
           $sycleFreePlanArr->expire_on = date("m-d-Y", strtotime($value->expire_on));

           $sycleFreePlan[] = $sycleFreePlanArr;
        }

        if(!empty($sycleFreePlan)) {
            return response()->json([
                'status' => 'success', 
                'data' => $sycleFreePlan
            ]);
        } else {
            return response()->json([
                'status' => 'success', 
                'data' => []
            ]);
        }
        
    }

    public function getSycleUserDefaultPlanDetails()
    {
        $sycleFreePlan = DB::table('subscription_plans')
            ->select('subscription_plans.*')
            ->where('status', 1)
            ->where('is_free_plan', 1)->first();

        if(!empty($sycleFreePlan)) {
            return response()->json([
                'status' => 'success', 
                'data' => [$sycleFreePlan]
            ]);
        } else {
            return response()->json([
                'status' => 'success', 
                'data' => []
            ]);
        }
        
    }
}
