<?php

namespace Modules\Marketing\Http\Controllers;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Modules\Marketing\Http\Requests\CreateCouponRequest;
use Modules\Marketing\Http\Requests\UpdateCouponRequest;
use Modules\Marketing\Services\CouponService;
use Yajra\DataTables\Facades\DataTables;
use Brian2694\Toastr\Facades\Toastr;
use Modules\UserActivityLog\Traits\LogActivity;

class CouponController extends Controller
{
    protected $couponService;
    public function __construct(CouponService $couponService)
    {
        $this->middleware('maintenance_mode');
        $this->couponService = $couponService;
    }
    public function index(){
        try{
            return view('marketing::coupon.index');
        }
        catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
            Toastr::error(__('common.error_message'), __('common.error'));
            return back();
        }
    }
    public function getData(){
        $coupon = $this->couponService->getAll();
        return DataTables::of($coupon)
            ->addIndexColumn()
            ->editColumn('title', function($coupon){
                return $coupon->title;
            })
            ->addColumn('type', function($coupon){
                return view('marketing::coupon.components._type_td',compact('coupon'));
            })
            ->addColumn('start_date', function($coupon){
                return dateConvert($coupon->start_date);
            })
            ->addColumn('end_date', function($coupon){
                return dateConvert($coupon->end_date);
            })
            ->addColumn('action', function($coupon){
                return view('marketing::coupon.components._action_td',compact('coupon'));
            })
            ->rawColumns(['type','action'])
            ->toJson();
    }
    public function getForm(Request $request){
        try{
            $id = $request->id;
            if($id == 1){
                return view('marketing::coupon.components.form_data_for_product');
            }elseif($id == 2){
                return view('marketing::coupon.components.form_data_for_order');
            }elseif($id == 3){
                return view('marketing::coupon.components.form_data_for_free_shipping');
            }elseif($id == 4){
                return view('marketing::coupon.components.form_data_for_merchant');
            }else{
                return false;
            }
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }
    public function store(CreateCouponRequest $request){
        if($request->coupon_type == 1){
            $request->validate([
                'product_list' => 'required',
                'discount' => 'required',
                'discount_type' => 'required'
            ]);
        }
        elseif($request->coupon_type == 2 || $request->coupon_type == 4){
            $request->validate([
                'minimum_shopping' => 'required',
                'maximum_discount' => 'nullable|min:0',
                'discount' => 'required',
                'discount_type' => 'required'
            ]);
        }
        elseif($request->coupon_type == 3){
            $request->validate([
                'maximum_discount' => 'nullable|min:0'
            ]);
        }
        try{
            $this->couponService->store($request->except('_token'));
            LogActivity::successLog('Coupon Created Successfully.');
            return $this->reloadWithData();
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }
    public function update(UpdateCouponRequest $request){
        $coupon = $this->couponService->editById($request->id);
        if($coupon->coupon_type == 1){
            $request->validate([
                'product_list' => 'required',
                'discount' => 'required',
                'discount_type' => 'required'
            ]);
        }
        elseif($coupon->coupon_type == 2 && $coupon->coupon_type == 4){
            $request->validate([
                'minimum_shopping' => 'required',
                'maximum_discount' => 'nullable|min:0',
                'discount' => 'required',
                'discount_type' => 'required'
            ]);
        }
        elseif($request->coupon_type == 3){
            $request->validate([
                'maximum_discount' => 'nullable|min:0'
            ]);
        }
        try{
            $this->couponService->update($request->except('_token'));
            LogActivity::successLog('Coupon Updated Successfully.');
            return $this->reloadWithData();
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }

    public function edit(Request $request){
        try{
            $coupon = $this->couponService->editById($request->id);
            return view('marketing::coupon.components.edit',compact('coupon'));
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }

    public function destroy(Request $request)
    {
        try{
            $this->couponService->deleteById($request->id);
            LogActivity::successLog('Coupon Deleted Successfully.');
            return $this->reloadWithData();
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }

    private function reloadWithData(){
        try{
            $coupons = $this->couponService->getAll();
            return response()->json([
                'TableData' =>  (string)view('marketing::coupon.components.list', compact('coupons')),
                'createForm' =>  (string)view('marketing::coupon.components.create')
            ]);
        }catch(Exception $e){
            LogActivity::errorLog($e->getMessage());
        }
    }

    public function coupon_info()
    {
        try {
            $coupons = $this->couponService->getAll()->get();
            return view('marketing::coupon.info', compact('coupons'));
        } catch (\Exception $e) {
            Toastr::error(__('common.error_message'), __('common.error'));
            LogActivity::errorLog($e->getMessage());
            return back();
        }

    }
}
