<?php

namespace App\Http\Controllers\Backend;

use App\Components\Functions;
use App\Models\Coupon;
use App\Models\Package;
use App\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Yajra\Datatables\Datatables;

class CouponController extends Controller
{
    //
    public function index()
    {
        return view('admin.coupon.index');
    }

    public function create()
    {
        return response([
            'status' => 1,
            'data' => view('admin.coupon.create')->render()
        ]);
    }

    public function redeem(Request $request)
    {
        $code = $request->input('code');

    }

    public function store(Request $request)
    {
        $data = $request->all();

        if (isset($data['is_payment'])) {
            if ($data['is_payment'] == 'on') {
                $data['is_payment'] = true;
            } else {
                $data['is_payment'] = false;
            }
        } else {
            $data['is_payment'] = false;
        }

        $data['from_date_expire'] = Carbon::createFromFormat('d/m/Y', $data['from_date_expire'])->toDateString();
        $data['end_date_expire'] = Carbon::createFromFormat('d/m/Y', $data['end_date_expire'])->toDateString();

        $data['package_apply'] = json_encode($data['package_apply']);
        try {
            \DB::beginTransaction();

            $coupon = Coupon::create($data);
            if ($data['is_payment'] == true) {

                $statusActive = Coupon::STATUS_IN_ACTIVE;
            } else {
                $statusActive = Coupon::STATUS_ACTIVE;
            }


            if (!empty($data['number'])) {
                if (is_numeric($data['number']) and $data['number'] > 0) {
                    for ($i = 1; $i <= $data['number']; $i++) {
                        $code = Functions::quickRandom(8);

                        $cnt = \DB::table('coupon_generates')->where('code', $code)->count();

                        if ($cnt == 0) {


                            \DB::table('coupon_generates')->insert([
                                'code' => $code,
                                'created_at' => Carbon::now()->toDateTimeString(),
                                'updated_at' => Carbon::now()->toDateTimeString(),
                                'is_active' => $statusActive,
                                'coupon_id' => $coupon->id
                            ]);
                        }
                    }
                }
            }

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();
            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra'
            ]);
        }

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function export($id)
    {
        $couponItem = Coupon::find($id);
        if ($couponItem) {
            $responseArr = [];

            $items = \DB::table('coupon_generates')->where('coupon_id', $couponItem->id)->get();
            foreach ($items as $item) {
                $itemArr = [];

                $itemArr['Mã'] = $item->code;
                $itemArr['Trạng thái'] = empty($item->status) ? 'Chưa sử dụng' : 'Đã sử dụng';
                $responseArr[] = $itemArr;
            }

            $name = 'Danh-sach-ma-' . str_slug($couponItem->name);

            \Excel::create($name . '-' . time(), function ($excel) use ($responseArr, $name) {
                $excel->sheet('Sheet1', function ($sheet) use ($responseArr) {
                    $sheet->fromArray($responseArr);
                });
            })->download('xls');
        }
    }

    public function exportLogCoupon($id)
    {
        $couponItem = Coupon::find($id);
        if ($couponItem) {
            $responseArr = [];

            $items = \DB::table('log_coupons')->where('coupon_id', $couponItem->id)->get();
            foreach ($items as $item) {
                $itemArr = [];
                $user = User::find($item->user_id);

                $itemArr['Mã'] = $item->code;
                $itemArr['Người sử dụng'] = !empty($user) ? $user->name : '';
                $itemArr['Thời điểm sử dụng'] = Carbon::createFromFormat('Y-m-d H:i:s', $item->created_at)->format('d/m/Y H:i');
                $responseArr[] = $itemArr;
            }

            $name = 'Danh-sach-su-dung-ma-' . str_slug($couponItem->name);

            \Excel::create($name . '-' . time(), function ($excel) use ($responseArr, $name) {
                $excel->sheet('Sheet1', function ($sheet) use ($responseArr) {
                    $sheet->fromArray($responseArr);
                });
            })->download('xls');
        }
    }

    public function addPartner(Request $request)
    {
        return response([
            'status' => 1,
            'data' => view('admin.coupon.partners')->render()
        ]);
    }

    public function activeCode(Request $request)
    {
        $id = $request->input('id');

        $check = \DB::table('coupon_generates')->where('id', $id)->first();

        if (!$check) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if ($check->is_active == Coupon::STATUS_ACTIVE) {
            return response([
                'status' => 0,
                'message' => 'Mã đã được kích hoạt'
            ]);
        }

        \DB::table('coupon_generates')->where('id', $id)
            ->update([
                'is_active' => Coupon::STATUS_ACTIVE
            ]);

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function getCode($id, Request $request)
    {
        $coupon = Coupon::find($id);
        if (!$coupon) {
            return redirect()->back()->with('error', 'Dữ liệu không hợp lệ');
        }
        return view('admin.coupon.code', compact('coupon'));
    }

    public function edit(Request $request)
    {
        $id = $request->input('id');
        $coupon = Coupon::find($id);
        if ($coupon) {
            return response([
                'status' => 1,
                'data' => view('admin.coupon.edit', compact('coupon'))->render()
            ]);
        }
    }

    public function update(Request $request)
    {
        $data = $request->all();


        $data['from_date_expire'] = Carbon::createFromFormat('d/m/Y', $data['from_date_expire'])->toDateString();
        $data['end_date_expire'] = Carbon::createFromFormat('d/m/Y', $data['end_date_expire'])->toDateString();
        
        try {
            \DB::beginTransaction();

            $coupon = Coupon::find($data['id']);
            $coupon->update($data);

            \DB::commit();
        } catch (\Exception $exception) {
            \DB::rollBack();
            return response([
                'status' => 0,
                'message' => 'Có lỗi xảy ra'
            ]);
        }

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function getCodeByAttribute(Request $request)
    {
        $id = $request->input('id');
        $code = \DB::table('coupon_generates')
            ->selectRaw('coupon_generates.*, CONCAT(u1.phone, " - ", u1.first_name," ", u1.last_name)  as given_to_name, 
            CONCAT(u2.phone, " - ", u2.first_name," ", u2.last_name) as used_by_name')
            ->where('coupon_id', $id)
            ->leftjoin('users as u1', 'coupon_generates.given_to', '=', 'u1.id')
            ->leftjoin('users as u2', 'coupon_generates.used_by', '=', 'u2.id');

        return Datatables::of($code)
            ->addIndexColumn()
            ->filterColumn('given_to_name', function ($query, $keyword) {
                $query->having('given_to_name', 'LIKE', '%' . $keyword . '%');
            })
            ->filterColumn('used_by_name', function ($query, $keyword) {
                $query->having('used_by_name', 'LIKE', '%' . $keyword . '%');
            })
            ->editColumn('status', function ($item) {
                if ($item->status == Coupon::COUPON_GENERATE_USED) {
                    return '<label class="label label-danger">Đã sử dụng</label>';
                }

                return '<label class="label label-success">Chưa sử dụng</label>';
            })
            ->editColumn('is_active', function ($item) {
                if ($item->is_active == Coupon::STATUS_ACTIVE) {
                    return '<label class="label label-danger">Đã kích hoạt</label>';
                }

                return '<label class="label label-success">Chưa kích hoạt</label>';
            })
            ->addColumn('action', function ($item) {

                $retVal = '';
                $retVal .= '<a data-id="' . $item->id . '" class="btn btn-sm btn-outline btn-editable btn-active red"><i class="fa fa-check"></i> Kích hoạt</a>';
                return $retVal;

            })
            ->make(true);
    }

    public function storePartner(Request $request)
    {
        $couponId = $request->input('coupon_id');
        $partner_id = $request->input('partner_id');

        if (empty($couponId)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (empty($partner_id)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $coupon = Coupon::find($couponId);

        if (empty($coupon)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        $partner = User::find($partner_id);

        if (empty($partner)) {
            return response([
                'status' => 0,
                'message' => 'Dữ liệu không hợp lệ'
            ]);
        }

        if (!empty($coupon->partner_id)) {
            return response([
                'status' => 0,
                'message' => 'Coupon đã được gán cho partner trước đó'
            ]);
        }

        $coupon->partner_id = $partner_id;
        $coupon->save();

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);

    }

    public function destroy(Request $request)
    {
        $id = $request->input('id');
        $coupon = Coupon::find($id);
        if ($coupon) {
            $coupon->delete();
        }

        return response([
            'status' => 1,
            'message' => 'Thành công'
        ]);
    }

    public function getCouponByAttribute()
    {
        $items = Coupon::select(\DB::raw('coupons.*, CONCAT(users.first_name, " ", users.last_name) AS partner_name'))
            ->leftjoin('users', 'coupons.partner_id', '=', 'users.id');

        return Datatables::of($items)
            ->addIndexColumn()
            ->addColumn('action', function ($item) {
                $retVal = '';
                $retVal .= '<a data-id="' . $item->id . '" href="#coupon-partner" data-toggle="modal" class="btn btn-sm btn-outline btn-editable yellow add-coupon-partner"><i class="fa fa-users"></i> Gán cho partner</a>';
                $retVal .= '<a data-id="' . $item->id . '" href="' . url('admin/coupon/export', ['id' => $item->id]) . '" class="btn btn-sm btn-outline btn-editable purple"><i class="fa fa-download"></i> Xuất mã</a>';
                $retVal .= '<a data-id="' . $item->id . '" href="' . url('admin/coupon/export-log', ['id' => $item->id]) . '" class="btn btn-sm btn-outline btn-editable red"><i class="fa fa-download"></i> Xuất log sử dụng</a>';
                $retVal .= '<a data-id="' . $item->id . '" href="#edit-coupon" data-toggle="modal"  class="btn btn-sm btn-outline btn-editable green btn-edit"><i class="fa fa-pencil"></i> Sửa</a>';
                $retVal .= '<a data-id="' . $item->id . '"  class="btn btn-sm btn-outline btn-editable dark btn-delete"><i class="fa fa-trash"></i> Xóa</a>';

                return $retVal;
            })
            ->editColumn('from_date_expire', function ($item) {
                if (!empty($item->from_date_expire)) {
                    return $item->from_date_expire->format('d/m/Y');
                }
            })
            ->editColumn('number', function ($item) {
                return '<a target="_blank" href="' . url('admin/coupon/code', ['id' => $item->id]) . '">' . $item->number . '</a>';
            })
            ->editColumn('is_payment', function ($item) {
                if (!empty($item->is_payment)) {
                    return 'Có';
                }
                return 'Không';
            })
            ->editColumn('end_date_expire', function ($item) {
                if (!empty($item->end_date_expire)) {
                    return $item->end_date_expire->format('d/m/Y');
                }
            })
            ->editColumn('package_ids', function ($item) {
                if (!empty($item->package_ids)) {
                    $cp = Package::find($item->package_ids);
                    if ($cp) {
                        return $cp->name;
                    }
                }
            })
            ->editColumn('package_apply', function ($item) {
                if (!empty($item->package_apply)) {
                    $packagesApply = json_decode($item->package_apply, true);
                    if (in_array(-1, $packagesApply)) {
                        return 'Tất cả';
                    }
                    $packageName = [];
                    foreach ($packagesApply as $package) {
                        $item = Package::find($package);
                        $packageName[] = $item->name;
                    }

                    return implode(',', $packageName);
                }
            })
            ->make(true);
    }
}