<?php

namespace App\Http\Controllers\Admin;

use App\Helpers\Helper;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Discount;
use App\Http\Resources\Admin\DiscountResource;
use Validator;

/**
 * Class DiscountController
 *
 * @package App\Http\Controllers
 */
class DiscountController extends Controller
{
    const ITEM_PER_PAGE = 100;

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Discount::notDeleted();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $status = Arr::get($searchParams, 'status', '');

        if (!empty($keyword)) {
            $list->where('code', 'LIKE', '%' . $keyword . '%');
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id', 'DESC');

        return DiscountResource::collection($list->paginate($limit));
    }

    public function all(Request $request)
    {
        $searchParams = $request->all();
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $list = Discount::select('id', 'code')->notDeleted()->orderBy('id', 'DESC');

        return DiscountResource::collection($list->paginate($limit));
    }

    public function available()
    {
        $list = Discount::select('id', 'code')->notDeleted()->isPublished()->orderBy('id', 'DESC');

        return DiscountResource::collection($list->get());
    }

    public function show($id = 0)
    {
        $discount = Discount::notDeleted()->where('id', $id)->first();
        if (!isset($discount)) return response()->json(['errors' => 'Discount code is not valid'], 403);

        return new DiscountResource($discount);
    }

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), ['code' => ['required'], 'type' => ['required'], 'total' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $params = $request->all();

        $startAt = ($params['start_at'] !== null && $params['start_at'] !== "") ? date('Y-m-d H:i:s', strtotime($params['start_at'])) : null;
        $endAt = ($params['end_at'] !== null && $params['end_at'] !== "") ? date('Y-m-d H:i:s', strtotime($params['end_at'])) : null;
        $timeLimit = ($params['time_limit'] !== null && $params['time_limit'] !== "" && $params['time_limit'] !== 0) ? $params['time_limit'] : null;
        $amountLimit = ($params['amount_limit'] !== null && $params['amount_limit'] !== "" && $params['amount_limit'] !== 0) ? $params['amount_limit'] : null;

        $discount = Discount::create([
            'code'         => $params['code'],
            'total'        => $params['total'],
            'type'         => $params['type'],
            'start_at'     => $startAt,
            'end_at'       => $endAt,
            'time_limit'   => $timeLimit,
            'amount_limit' => $amountLimit,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        return new DiscountResource($discount);
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['code' => ['required'], 'type' => ['required'], 'total' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $discount = Discount::notDeleted()->where('id', $id)->first();
        if (!isset($discount)) return response()->json(['errors' => 'Discount code is not valid'], 403);
        $params = $request->all();

        $startAt = ($params['start_at'] !== null && $params['start_at'] !== "") ? date('Y-m-d H:i:s', strtotime($params['start_at'])) : null;
        $endAt = ($params['end_at'] !== null && $params['end_at'] !== "") ? date('Y-m-d H:i:s', strtotime($params['end_at'])) : null;
        $timeLimit = ($params['time_limit'] !== null && $params['time_limit'] !== "" && $params['time_limit'] !== 0) ? $params['time_limit'] : null;
        $amountLimit = ($params['amount_limit'] !== null && $params['amount_limit'] !== "" && $params['amount_limit'] !== 0) ? $params['amount_limit'] : null;

        $discount->update([
            'total'        => $params['total'],
            'type'         => $params['type'],
            'start_at'     => $startAt,
            'end_at'       => $endAt,
            'time_limit'   => $timeLimit,
            'amount_limit' => $amountLimit,
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'created_at'   => date('Y-m-d H:i:s'),
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        return response()->json(null, 204);
    }

    public function destroy($id = 0)
    {
        $discount = Discount::notDeleted()->where('id', $id)->first();
        if (!isset($discount)) response()->json(['error' => 'Ehhh! Can not delete this discount code'], 403);

        try {
            $discount->update(['is_deleted' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function destroyMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $discounts = Discount::notDeleted()->whereIn('id', $listIds)->get();
        if ($discounts->count() <= 0) response()->json(['error' => 'Discount code is not valid.'], 403);
        try {
            Discount::notDeleted()->whereIn('id', $listIds)->update(['is_deleted' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function activateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $discounts = Discount::notDeleted()->whereIn('id', $listIds)->get();
        if ($discounts->count() <= 0) response()->json(['error' => 'Discount code is not valid.'], 403);
        try {
            Discount::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => true]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }

    public function deactivateMultiple(Request $request)
    {
        $validator = Validator::make($request->all(), ['ids' => 'required']);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $listIds = $request->get('ids', []);
        $discounts = Discount::notDeleted()->whereIn('id', $listIds)->get();
        if ($discounts->count() <= 0) response()->json(['error' => 'Discount code is not valid.'], 403);
        try {
            Discount::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

        return response()->json(null, 204);
    }
}
