<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Faq;
use App\FaqLink;
use App\Http\Resources\Admin\FaqResource;
use Validator;

/**
 * Class KeywordController
 *
 * @package App\Http\Controllers
 */
class FaqController extends Controller
{
    const ITEM_PER_PAGE = 20;

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

		if ($type != '') {
			$list->where('type', $type);
		}
		
		if ($group != '') {
			$list->where('group', $group);
		}
		
        if (!empty($keyword)) {
            $list->where(function ($query) use ($keyword) {
                $query->where('name', 'LIKE', "%$keyword%")
                    ->orWhere('description', 'LIKE', "%$keyword%");
            });
        }
        if ($status != '') {
            $list->where('is_activated', $status);
        }
        $list->orderBy('id', 'ASC'); //orderBy('group', 'ASC')

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

    public function all()
    {
        $list = Faq::select('id', 'name', 'description')->notDeleted()->orderBy('id');

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

    public function show($id = 0)
    {
        $faq = Faq::with('faqLinks')->notDeleted()->where('id', $id)->first();
        if (!isset($faq)) return response()->json(['errors' => __('messages.faq_not_valid')], 403);
        return new FaqResource($faq);
    }

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

        $checkKeyword = Faq::where('name', $params['name'])
            ->where('group', $params['group'])
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->first();
        if (isset($checkKeyword) && $checkKeyword->id != null) return response()->json(['data' => ['status' => 'error', 'message' => __('messages.faq_already_exists')]], 200);

        $faq = Faq::create([
            'type'         => isset($params['type']) ? $params['type'] : 0,
            'name'         => $params['name'],
            'description'  => $params['description'],
            'group'        => $params['group'],
            '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')
        ]);

        // Handle FAQ links
        if (isset($params['faq_links']) && is_array($params['faq_links'])) {
            foreach ($params['faq_links'] as $index => $linkData) {
                if (!empty($linkData['name']) && !empty($linkData['url'])) {
                    FaqLink::create([
                        'faq_id' => $faq->id,
                        'name' => $linkData['name'],
                        'url' => $linkData['url'],
                        'order' => $index
                    ]);
                }
            }
        }

        return new FaqResource($faq->load('faqLinks'));
    }

    public function update($id = 0, Request $request)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'is_activated' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);
        $faq = Faq::notDeleted()->where('id', $id)->first();
        if (!isset($faq)) return response()->json(['errors' => __('messages.faq_not_valid')], 403);

        $params = $request->all();
        $checkKeyword = Faq::where('name', $params['name'])
            ->where('group', $params['group'])
            ->where('is_activated', true)
            ->where('is_deleted', false)
            ->where('id', '!=', $faq->id)
            ->first();
        if (isset($checkKeyword) && $checkKeyword->id != null) return response()->json(['data' => ['status' => 'error', 'message' => __('messages.faq_already_exists')]], 200);

        $faq->update([
            'type'         => isset($params['type']) ? $params['type'] : 0,
            'name'         => $params['name'],
            'description'  => $params['description'],
            'group'        => $params['group'],
            'is_activated' => ($params['is_activated'] === true) ? 1 : 0,
            'updated_at'   => date('Y-m-d H:i:s')
        ]);

        // Handle FAQ links update
        if (isset($params['faq_links']) && is_array($params['faq_links'])) {
            // Delete existing links first
            FaqLink::where('faq_id', $faq->id)->delete();
            
            // Create new links with order
            foreach ($params['faq_links'] as $index => $linkData) {
                if (!empty($linkData['name']) && !empty($linkData['url'])) {
                    FaqLink::create([
                        'faq_id' => $faq->id,
                        'name' => $linkData['name'],
                        'url' => $linkData['url'],
                        'order' => $index
                    ]);
                }
            }
        }

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

    public function tags()
    {
        $list = Faq::published()->select('name')->get();
        return response()->json(['data' => $list], 200);
    }

    public function destroy($id = 0)
    {
        $faq = Faq::notDeleted()->where('id', $id)->first();
        if (!isset($faq)) response()->json(['error' => __('messages.cannot_delete_faq')], 403);

        try {
            $faq->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', []);
        $faqs = Faq::notDeleted()->whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => __('messages.faq_is_invalid')], 403);
        try {
            Faq::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', []);
        $faqs = Faq::notDeleted()->whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => __('messages.faq_is_invalid')], 403);
        try {
            Faq::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', []);
        $faqs = Faq::notDeleted()->whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => __('messages.faq_is_invalid')], 403);
        try {
            Faq::notDeleted()->whereIn('id', $listIds)->update(['is_activated' => false]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

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