<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\UserToActivity;
use App\Models\Activity;
use Datatables;

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

		$data = $request->all();
		$data['created_by'] = $this->currentName;

		if(!UserToActivity::create($data))
			return response()->json(['status'=>'failed','message'=>'Failed to add data!','code'=> 500]);

		return response()->json(['status'=>'success','message'=>'Data added!', 'code'=> 200]);
	}

	public function addMultiple(Request $request){
		$users_id = $request->user_id;
    $users_role = $request->role_proyek_id;

		// $data = UserToActivity::where("activity_id", $request->activity_id);
		// if($data){
		// 	$data->delete();
		// }

		if(is_array($users_id) && count($users_id) > 0){
			$countRes = 0;
			foreach($users_id as $index => $item){
				$dataInsert = array(
					"user_id"           => $item,
					"activity_id"       => $request->activity_id,
					"role_proyek_id"    => $users_role[$index],
					"proyek_id"         => $request->proyek_id,
					"created_by"        => $this->currentName
				);
				$result = UserToActivity::create($dataInsert);
				if($result){
					$countRes++;
				}else{
					$countRes--;
				}
			}

			if($countRes == 0)
				return response()->json(['status'=>'failed' ,'message'=>'Failed to add data!','code'=> 500]);

			$allCost = $this->calculateAllCost($request->activity_id, $request->proyek_id);
			$dataUpdateCost = array(
				"rencana_biaya"=>$allCost,
				"updated_by"=> $this->currentName
			);
			$actUpdate = Activity::find($request->activity_id);
			if($actUpdate){
				$actUpdate->update($dataUpdateCost);
				if($actUpdate->parent_id){
					$this->updatedCostPlanning($actUpdate->parent_id);
				}
			}
			return response()->json(['status'=>'success' ,'message'=>'Data added!','code'=>200]);
		}else{
			return response()->json(['status'=>'success' ,'message'=>'Data added!','code'=>200]);
		}

	}

	private function updatedCostPlanning($parent_id) {
		$sumBiaya = Activity::selectRaw('sum(cast(rencana_biaya as double precision))')
			->where("parent_id", $parent_id)
			->first();
		if($parent = Activity::find($parent_id)){
			$parent->update([
				"rencana_biaya" => $sumBiaya->sum,
			]);
		}
  }

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

		$data = UserToActivity::find($id);
		if(!$data)
			return response()->json(['status'=>'failed','message'=>'Data not found!','code'=> 404], 404);

		if(!$data->update($request->all()));
			return response()->json(['status'=>'failed','message'=>'Failed to update!','code'=> 500], 500);

		return response()->json(['status'=>'success','message'=>'Data updated!','code'=>200], 200);
	}

	public function delete($id)
	{
		$data = UserToActivity::find($id);
		if(!$data)
			return response()->json(['status'=>'failed','message'=>'data user to activity gantt Project not found!','code'=>400], 400);

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

		return response()->json(['status'=>'failed','message'=>'Failed to delete!','code'=> 500], 500);
	}

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

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

		if(!$result)
			return response()->json(['status'=>'failed','message'=>'failed get data tools resource, please try again later!','code'=>400], 400);

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

	public function search(Request $request)
	{
		$payload = $request->all();
		$dataBuilder = $this->setUpPayload($payload, 'assign_hr_to_activity');
		$builder = $dataBuilder['builder'];
		$countBuilder = $dataBuilder['count'];
		$dataGet = $builder->get();
		$totalRecord = $countBuilder->count();
		return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200);
	}

	public function list()
	{
		$data = UserToActivity::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 user to activity gantt, please try again later!','code'=>400], 400);
		}
  }

  public function listFiltered(Request $request)
	{
    $startDate = $request->start_date;
    $endDate = $request->end_date;
    $userId = $request->user_id;
    $proyekId = $request->proyek_id;

    if (isset($proyekId)) {
       $data = UserToActivity::select('assign_hr_to_activity.id', 'assign_hr_to_activity.activity_id', 'm_activity.name', 'm_activity.kode_sortname', 'm_activity.start_date', 'm_activity.end_date')
        ->join('m_activity', 'assign_hr_to_activity.activity_id', '=', 'm_activity.id')
        ->where('m_activity.start_date', '=', $startDate)
        ->where('m_activity.end_date', '=', $endDate)
        ->where('assign_hr_to_activity.user_id', '=', $userId)
        ->where('assign_hr_to_activity.proyek_id', '=', $proyekId)
        ->get();
    }else {
        $data = UserToActivity::select('assign_hr_to_activity.id', 'assign_hr_to_activity.activity_id', 'm_activity.name', 'm_activity.kode_sortname', 'm_activity.start_date', 'm_activity.end_date')
        ->join('m_activity', 'assign_hr_to_activity.activity_id', '=', 'm_activity.id')
        ->where('m_activity.start_date', '=', $startDate)
        ->where('m_activity.end_date', '=', $endDate)
        ->where('assign_hr_to_activity.user_id', '=', $userId)
        ->get();    
    }
        $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 user to activity gantt, please try again later!','code'=>400], 400);
		}
	} 

	public function datatables(Request $request){
		$id_activity = $request->query('idact');
		$data = UserToActivity::select("assign_hr_to_activity.id as id", "u.name as user_name", "mrp.name as role_name")
			->join("m_role_proyek as mrp", "mrp.id", "=", "assign_hr_to_activity.role_proyek_id")
			->join("m_users as u", "u.id", "=", "assign_hr_to_activity.user_id")
			->where('assign_hr_to_activity.activity_id', $id_activity)
			->get();
		return Datatables::of($data)
			->addIndexColumn()
			->addColumn('action', function($row){
				$actionBtn = '<a href="javascript:void(0)" data-id="'.$row->id.'" class="delete btn btn-danger btn-sm btn-hr-delete"><i class="fa fa-trash"></i></a>';
				return $actionBtn;
			})
			->rawColumns(['action'])->make(true);
	}
}