<?php

namespace App\Http\Controllers;

use App\Daerah;
use App\Negeri;
use App\Poskod;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Validation\ValidationException;

class PoskodController extends Controller
{
    public function showAllPoskod()
    {
        $poskod = Poskod::on('mysql7')
            ->with(['negeri:kodnegeri,negeri', 'daerah:koddaerah,namadaerah'])
            ->when(request()->query_string, function ($q) {
                return $q
                    ->where('poskod', 'like', '%' . request()->query_string . '%')
                    ->orWhereHas('negeri', function ($b) {
                        $b->where(DB::connection('mysql7')->raw('lower(negeri)'), 'like', '%' . strtolower(request()->query_string) . '%');
                    })
                    ->orWhereHas('daerah', function ($b) {
                        $b->where(DB::connection('mysql7')->raw('lower(namadaerah)'), 'like', '%' . strtolower(request()->query_string) . '%');
                    });
            })
            ->paginate(12);

        return response()
            ->json($poskod)
            ->header('query_string', request()->query_string);
    }

    public function showOnePoskod($poskod)
    {
        $poskod = Poskod::on('mysql7')
            ->with(['negeri:kodnegeri,negeri', 'daerah:koddaerah,namadaerah'])
            ->where('poskod', '=', $poskod)
            ->first();

        return response()->json($poskod);
    }

    public function store(Request $request)
    {

        try {
            $validated = $this->validate($request, [
                'poskod' => 'required|numeric|digits:5|unique:poskod,poskod',
                'koddaerah' => 'required|numeric',
                'kodnegeri' => 'required|numeric',
            ]);
        } catch (ValidationException $e) {
            return response()->json($e, 403);
        }

        $created_poskod = Poskod::on('mysql7')->create([
            'poskod' => $validated['poskod'],
            'koddaerah' => $validated['koddaerah'],
            'kodnegeri' => $validated['kodnegeri'],
        ]);

        return response()->json($created_poskod, 200);
    }

    public function update(Request $request)
    {
        $poskod = Poskod::on('mysql7')->find($request->recno);

        try {
            $validated = $this->validate($request, [
                'poskod' => 'required|numeric|digits:5|unique:poskod,poskod,' . $poskod->poskod . ',poskod',
                'koddaerah' => 'required|numeric',
                'kodnegeri' => 'required|numeric',
            ]);
        } catch (ValidationException $e) {
            return response()->json($e, 403);
        }

        $poskod->update([
            'poskod' => $validated['poskod'],
            'koddaerah' => $validated['koddaerah'],
            'kodnegeri' => $validated['kodnegeri'],
        ]);

        $poskod_changes = $poskod->getChanges();

        $getProperChanges = function($poskod_changes){

            $changes = [];

            if(array_key_exists('poskod', $poskod_changes)){
                $poskod = $poskod_changes['poskod'];

                array_push($changes, compact('poskod'));

            }

            if(array_key_exists('koddaerah', $poskod_changes)){
                $daerah = Daerah::where('koddaerah', '=', $poskod_changes['koddaerah'])->first()->namadaerah;

                array_push($changes, compact('daerah'));

            }

            if(array_key_exists('kodnegeri', $poskod_changes)){
                $negeri = Negeri::where('kodnegeri', '=', $poskod_changes['kodnegeri'])->first()->negeri;

                array_push($changes, compact('negeri'));
            }

            return array_merge(...$changes);

        };

        $poskod_changes = $getProperChanges($poskod_changes);

        return response()->json(compact('poskod', 'poskod_changes'), 200);
    }
}
