<?php

namespace App\Http\Controllers;

use Log;
use Illuminate\Http\Request;
use App\Models\Presence;
use GuzzleHttp\Client;
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;

class PresenceController extends Controller
{
    public function add(Request $request)
    {
        $this->validate($request, [
            'user_id' => 'required'
        ]);


        if($request->type=="out"){

            $clock_out_loc = "-";
            $dataUpdate = array(
                "clock_out"=>$request->clock_time,
                "clock_out_lat" => $request->clock_out_lat,
                "clock_out_lng" => $request->clock_out_lng,
                "updated_by"=>$this->currentName,
                "clock_out_loc" => $clock_out_loc
            );

            $resultUpdate = $this->updateFormAdd($dataUpdate, $request->user_id);
            if($resultUpdate && $resultUpdate > 0){
                return response()->json(['status'=>'success', 'id'=>$resultUpdate,'message'=>'clock out success!','code'=>200], 200);
            }
            else{
                return response()->json(['status'=>'failed','message'=>'clock out failed please try again!','code'=>400], 400);
            }
            die();
        }

        $date = date_create($request->clock_time);
        $onlyDate = date_format($date,"Y-m-d");


        $clock_in_loc = "-";

        $dataAdd = array(
            'user_id'=> $request->user_id,
            'clock_in'=> $request->clock_time,
            'date_presence'=> $onlyDate,
            'created_by' =>$this->currentName,
            'clock_in_lat' => $request->clock_in_lat,
            'clock_in_lng' => $request->clock_in_lng,
            'clock_in_loc' => $clock_in_loc
        ); 

        $result = Presence::create($dataAdd);

        if($result){
            return response()->json(['status'=>'success', 'id'=>$result->id,'message'=>'clock in successfully!','code'=>200], 200);
        }else{
            return response()->json(['status'=>'failed','message'=>'clock in failed!','code'=>400], 400);
        }
    }

    public function edit($id){
        if(!$id || (int) $id < 0 || $id==""){
            return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);
            die();
        }

        $result = Presence::find($id);

        if($result){
            return response()->json(['status'=>'success','code'=>200,'data'=>$result], 200);
        }else{
            return response()->json(['status'=>'failed','message'=>'failed get data project, please try again later!','code'=>400], 400);
        }
    }



    public function clockinout($id) {
        $dateTimeNow = Carbon::now()->addHour(7);
        $dataPresence = Presence::where('user_id', $id)->orderBy('id', 'DESC')->first();



        if($dataPresence){
                       
                $dateNow = date("Y-m-d");
                $dateA = strtotime($dataPresence->clock_in);
                $dayClockin = date("Y-m-d", $dateA);
                if($dayClockin == $dateNow){
                    $clock_in = $dataPresence->clock_in;
                    $clock_out = $dataPresence->clock_out;
                }else{
                    $clock_in = null;
                    $clock_out = null;
                }
            $res_data = array(
                "id" => $dataPresence->id,
                "at" => $dateTimeNow,
                "user_id"=> $id,
                "clock_in"=> $clock_in,
                "clock_out"=> $clock_out,
                "last_clock_in"=> $dataPresence->clock_in,
                "last_clock_out"=> $dataPresence->clock_out,
                "in_working_time"=> true
            );
            return response()->json(['status'=>'success','data'=>$res_data,'code'=>200], 200);
        }
        $res_data = array(
            "id" => null,
            "at" => $dateTimeNow,
            "user_id"=> $id,
            "clock_in"=> null,
            "clock_out"=> null,
            "last_clock_in"=> null,
            "last_clock_out"=> null,
            "in_working_time"=> true
        );
        return response()->json(['status'=>'success','data'=>$res_data,'code'=>200], 200);
    }

    private function updateFormAdd($data, $id){

        $date = date_create($data['clock_out']);

        $onlyDate = date_format($date,"Y-m-d");


        $dataPresence = Presence::where('user_id',$id)
            ->where("clock_in", "<=", $data["clock_out"])
            ->orderByDesc("id")
            ->first();
        
        if($dataPresence){
            $queryUpdate = $dataPresence->update($data);
            if($queryUpdate){
                $getDataUpdate = Presence::where('user_id', $id)->where("date_presence", $onlyDate)->first();
                return $getDataUpdate->id;
            }else{
                return false;
            }
        }else{
            return false;
        }
        die();
    }

    public function update(Request $request, $id)
    {
        if(!$id || (int) $id < 0 || $id==""){
            return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400);
        }

        $data = Presence::find($id);

        if($data){
            $result = $data->update($request->all());
        }else{
            return response()->json(['status'=>'failed','message'=>'data presence not found!','code'=>400], 400);
            die();
        }
        
        
        if($result){
            return response()->json(['status'=>'success','message'=>'data presence successfully updated!','code'=>200], 200);
        }else{
            return response()->json(['status'=>'failed','message'=>'data presence  failed updated!','code'=>400], 400);
        }
    }

    public function delete($id)
    {
        $data = Presence::find($id);

        if($data){
            $delete = $data->delete();
        }else{
            return response()->json(['status'=>'failed','message'=>'data presence not found!','code'=>400], 400);
            die();
        }
        

        if($delete){
            return response()->json(['status'=>'success','message'=>'data presence successfully deleted!','code'=>200], 200);
        }else{
            return response()->json(['status'=>'failed','message'=>'data presence failed deleted!','code'=>400], 400);
        }
    }

    public function search(Request $request)
    {
        $payload = $request->all();
        $dataBuilder = $this->setUpPayload($payload, 't_clock_in_out');
        $builder = $dataBuilder['builder'];
        $countBuilder = $dataBuilder['count'];
        $dataGet = $builder->get();
        $finalData = [];


        $totalRecord = $countBuilder->count();
        return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200);
    }

    public function list()
    {
        $data = Presence::all();
        $countData = $data->count();

        if($data){
            return response()->json(['status'=>'success','code'=>200,'data'=>$data, 'totalRecord'=>$countData], 200);
        }else{
            return response()->json(['status'=>'failed','message'=>'failed get list presence, please try again later!','code'=>400], 400);
        }
    }

    public function bulkUpdateLocation()
    {
        $data = Presence::all();
        $finalData = [];
        foreach($data as $objRow) {
            $presence = Presence::find($objRow->id);

            $clock_in_lat = $objRow->clock_in_lat;
            $clock_in_lng = $objRow->clock_in_lng;
            $objRow->clock_in_loc = "";
            if (isset($clock_in_lat) && isset($clock_in_lng)) {
                $response = Http::get(config('api.nominatim') . "/reverse?lat=".$clock_in_lat."&lon=".$clock_in_lng."&format=json");
                $objRow->clock_in_loc = $response->json()["display_name"];
            }

            $clock_out_lat = $objRow->clock_out_lat;
            $clock_out_lng = $objRow->clock_out_lng;
            $objRow->clock_out_loc = "";
            if (isset($clock_out_lat) && isset($clock_out_lng)) {
                $response = Http::get(config('api.nominatim') . "/reverse?lat=".$clock_out_lat."&lon=".$clock_out_lng."&format=json");
                $objRow->clock_out_loc = $response->json()["display_name"];
            }


            $presence->clock_in_loc = $objRow->clock_in_loc;
            $presence->clock_out_loc = $objRow->clock_out_loc;
            $presence->save();
        }
    }
}