<?php

namespace App\Http\Controllers\Admin;

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

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

    public function index(Request $request)
    {
        $searchParams = $request->all();
        $list = Photo::select('*');
        $limit = Arr::get($searchParams, 'limit', static::ITEM_PER_PAGE);
        $keyword = Arr::get($searchParams, 'keyword', '');
        $projectId = Arr::get($searchParams, 'projectId', '');
        $userId = Arr::get($searchParams, 'userId', '');
        $status = Arr::get($searchParams, 'status', '');
        $orderType = Arr::get($searchParams, 'order', '');

        if (!empty($keyword)) {
            $list->where(function ($query) use ($keyword) {
                $query->where('id', "$keyword")
                    ->orWhere('name', 'LIKE', "%$keyword%");
            });
        }
        if ($projectId != null && $projectId != "") {
            $list->where('project_id', $projectId);
        }
        if ($userId != null && $userId != "") {
            $list->where('assigned_id', $userId);
        }
        if ($status != '') {
            $list->where('status', $status);
        }
        if ($orderType == 'latest') {
            $list->orderBy('updated_at', 'DESC');
        } else {
            $list->orderBy('id', 'DESC');
        }

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

    public function all()
    {
        $list = Photo::select('*')->orderBy('id', 'DESC');

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

    public function show($id = 0)
    {
        $faq = Photo::where('id', $id)->first();
        if (!isset($faq)) return response()->json(['errors' => 'Poster is not valid'], 403);
        return new FaqResource($faq);
    }

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

        $image = null;
        $assigned_id = null;
        if ($params['image'] != null && $params['image'] != "") $image = $params['image'];
        if ($params['assigned_id'] != null && $params['assigned_id'] != "") $assigned_id = $params['assigned_id'];

        $photo = Photo::create([
            'project_id'  => $params['projectId'],
            'code'        => rand(11111111, 999999999),
            'name'        => $params['name'],
            'address'     => $params['address'],
            'image'       => $image,
            'assigned_id' => $assigned_id,
            'user_id'     => auth('api')->user()->id,
            'note'        => $params['note'],
            'status'      => $params['status'],
            'created_at'  => date('Y-m-d H:i:s'),
            'updated_at'  => date('Y-m-d H:i:s'),
        ]);

        return new FaqResource($photo);
    }

    public function update(Request $request, $id = 0)
    {
        $validator = Validator::make($request->all(), ['name' => ['required'], 'projectId' => ['required'], 'status' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $faq = Photo::where('id', $id)->first();
        if (!isset($faq)) return response()->json(['errors' => 'Poster is not valid'], 403);

        $params = $request->all();
        $image = null;
        if ($params['image'] != null && $params['image'] != "") $image = $params['image'];

        $faq->update([
            'project_id'  => $params['projectId'],
            'name'        => $params['name'],
            'address'     => $params['address'],
            'image'       => $image,
            'assigned_id' => $params['assigned_id'],
            'note'        => $params['note'],
            'status'      => $params['status'],
            'updated_at'  => date('Y-m-d H:i:s')
        ]);

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

    public function updateStatus(Request $request, $id = 0)
    {
        $validator = Validator::make($request->all(), ['status' => ['required']]);
        if ($validator->fails()) return response()->json(['errors' => $validator->errors()], 403);

        $faq = Photo::where('id', $id)->first();
        if (!isset($faq)) return response()->json(['errors' => 'Photo is not valid'], 403);
        $status = $request->get('status');

        $faq->update([
            'status'     => $status,
            'updated_at' => date('Y-m-d H:i:s')
        ]);

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

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

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

        try {
            $faq->delete();
        } 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 = Photo::whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => 'Poster is not valid.'], 403);
        try {
            Photo::whereIn('id', $listIds)->delete();
        } 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 = Photo::whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => 'FAQ is not valid.'], 403);
        try {
            Photo::whereIn('id', $listIds)->update(['status' => 2, 'updated_at' => date('Y-m-d H:i:s')]);
        } 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 = Photo::whereIn('id', $listIds)->get();
        if ($faqs->count() <= 0) response()->json(['error' => 'FAQ is not valid.'], 403);
        try {
            Photo::whereIn('id', $listIds)->update(['status' => 3, 'updated_at' => date('Y-m-d H:i:s')]);
        } catch (\Exception $ex) {
            response()->json(['error' => $ex->getMessage()], 403);
        }

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

    public function createMixAuto(Request $request, $id = 0)
    {
        //Photo::where('id', '<=', 15)->update(['file_mix' => null]);

        $status = "success";
        $hasNext = true;
        $imageContent = $request->has('image') ? $request->get('image') : null;

        if ($id != 0 && $id != "0" && $imageContent != null && $imageContent != "") {
            $cPhoto = Photo::select('*')->where('id', $id)->first();
            $fileUrl = $cPhoto->file_url;
            $newMixFile = str_replace(".jpeg", "_mix.png", $fileUrl);
            $this->base64_to_png($imageContent, public_path('uploads/files/aws/' . $newMixFile));
            $cPhoto->update(['file_mix' => $newMixFile, 'updated_at' => date('Y-m-d H:i:s')]);
        }

        $photo = Photo::select('*')
            ->where('id', '>', $id)
            ->whereNotNull('file_color')
            ->whereNull('file_mix')
            ->orderBy('id')
            ->first();

        if (!$photo || $photo == null || $photo == "") {
            $hasNext = false;
            $status = "error";
        }

        return response()->json(['status' => $status, 'hasNext' => $hasNext, 'item' => $photo], 200);
    }

    public function base64_to_png($base64_string, $output_file)
    {
        $ifp = fopen($output_file, 'wb');
        $data = explode(',', $base64_string);
        fwrite($ifp, base64_decode($data[1]));
        fclose($ifp);

        return $output_file;
    }
}
