<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\UserToActivity;
use App\Models\Activity;
use App\Models\AssignMaterial;
use Illuminate\Support\Facades\DB;
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,
					"start_date"         => $request->start_date,
					"end_date"         => $request->end_date,
                    "created_by"        => $this->currentName,
                    "version_gantt_id"  => $request->version_gantt_id
				);
				$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 searchAnalysis(Request $request)
	{
		$dataBuilder = $this->setUpPayload($request->all(), 'assign_hr_to_activity');
		$builder = $dataBuilder['builder'];
		$countBuilder = $dataBuilder['count'];
        $builder->addSelect(DB::raw('SUM(report_activity_material.qty) as volume_actual'));
        $builder->groupBy("m_activity.id");
        $builder->groupBy("selfTable.id");
        $builder->groupBy("selfTable.start_date");
        $builder->groupBy("selfTable.end_date");
        $builder->groupBy("m_users.name");
        $builder->groupBy("assign_material_to_activity.id");
        $builder->groupBy("m_version_gantt.name_version");
		$dataGet = $builder->get();
		$totalRecord = $countBuilder->count();
		return response()->json(['status' => 'success', 'code' => 200, 'data' => $dataGet, 'totalRecord' => $totalRecord], 200);
	}

	public function search(Request $request)
	{
		$payload = $request->all();
		if (isset($payload['join_column'])) {
			$join_column = $payload['join_column'];
			unset($payload['join_column']);
		}

		$dataBuilder = $this->setUpPayload($payload, 'assign_hr_to_activity');
		$builder = $dataBuilder['builder'];
		// $countBuilder = $dataBuilder['count'];
		if (isset($join_column)) {
			$startDate = $join_column['start_date'];
			$endDate = $join_column['end_date'];
			$status = $join_column['status'];
			$startDate = date("Y-m-d H:i:sO", strtotime($startDate));
			$endDate = date("Y-m-d H:i:sO", strtotime($endDate));
		    $builder->where(function ($query) use ($startDate, $endDate) {
				$query
					->where('m_proyek.mulai_proyek', '>=', $startDate)
					->where('m_proyek.akhir_proyek', '<=', $endDate)
					->where(function ($query) use ($endDate, $startDate) {
						$query
							->where('m_activity.start_date', '>=', $startDate)
							->where('m_activity.end_date', '<=', $endDate);
					});
			});
		}
		$dataGet = $builder->get();
		if (isset($status) && $status != "") {
			$filteredData = [];
			foreach ($dataGet as $value) {
				$assignMaterial = AssignMaterial::where('activity_id', $value->activity_id)->first();
				if ($assignMaterial->status_activity == $status) {
					$filteredData[] = $value;
				}
			}
			$dataGet = $filteredData;
		}
		// $totalRecord = $countBuilder->count();
		return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>count($dataGet)], 200);
	}

	public function activityUser(Request $request){
		$payload = $request->all();
		$activity = DB::table('m_activity as ma')
				->select('ahta.id', 'ma.id as activity_id', 'ma.proyek_id', 'ma.name as join_second_name', 'ma.start_date as join_second_start_date', 
				'ma.end_date as join_second_end_date', 'ma.persentase_progress', 'mvg.name_version', 'mp.nama as nama_proyek', 'mp.type_proyek_id')
				->join('assign_hr_to_activity as ahta', 'ahta.activity_id', '=', 'ma.id')
				->join('m_version_gantt as mvg', 'mvg.id', '=', 'ma.version_gantt_id')
				->join('m_proyek as mp', 'mp.id', '=', 'ma.proyek_id') 
				->where('ahta.user_id', $payload['user_id'])
				->where('ma.start_date', '<=', $payload['start_date'])
				->where('ma.end_date', '>=', $payload['end_date'])
				->where('ma.proyek_id', $payload['proyek_id'])
				->get();

		if ($payload['status'] != "") {
			$filteredData = [];
			foreach ($activity as $value) {
				$assignMaterial = AssignMaterial::where('activity_id', $value->activity_id)->first();
				if ($assignMaterial->status_activity == $payload['status']) {
					$filteredData[] = $value;
				}
			}
			$activity = $filteredData;
		}
		return response()->json(['status'=>'success','code'=>200,'data'=>$activity, 'totalRecord'=>count($activity)], 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", "assign_hr_to_activity.start_date", "assign_hr_to_activity.end_date", "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);
	}
}