<?php namespace App\Http\Controllers;

use App\Models\Ajuantebang;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Validator, Input, Redirect ; 

class AjuantebangController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'ajuantebang';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Ajuantebang();
		
		$this->info = $this->model->makeInfo( $this->module);
		$this->access = $this->model->validAccess($this->info['id']);
	
		$this->data = array(
			'pageTitle'			=> 	$this->info['title'],
			'pageNote'			=>  $this->info['note'],
			'pageModule'		=> 'ajuantebang',
			'pageUrl'			=>  url('ajuantebang'),
			'return' 			=> 	self::returnUrl()	
		);	
			
				
	} 
	public function index()
	{
		if(!\Auth::check()) 
			return redirect('user/login')->with('status', 'error')->with('message','You are not login');

		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));
		if($this->access['is_view'] ==0) 
			return redirect('dashboard')->with('message',__('core.note_restric'))->with('status','error');
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['tableForm'] 	= $this->info['config']['forms'];
		$this->data['tableGrid'] 	= $this->info['config']['grid'];
		usort($this->data['tableGrid'], "SiteHelpers::_sort");
			$cols = '{"data":"rowId"},';
			if($this->data['setting']['view-method'] =='expand'){
				$cols .= '{"className": "details-control","orderable": false,"data": null,"defaultContent": ""},';
			}		
				
			foreach($this->data['tableGrid'] as $field)
			{				
				
				if($field['view'] =='1')
				{
					$cols .= '{"data":"'.$field['field'].'"},';
				}						
			}
			$cols .= '{"data":"action"},';
		$this->data['column'] = $cols ;	
		$this->data['access']		= $this->access;	
		$this->data['setting'] 		= $this->info['setting'];
		return view('ajuantebang.index',$this->data);
	}
	function create( Request $request ) 
	{
		$this->hook( $request  );
		if($this->access['is_add'] ==0) 
			return redirect('dashboard')->with('message', __('core.note_restric'))->with('status','error');

		$this->data['row'] = $this->model->getColumnTable( $this->info['table']); 
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['id'] = '';
		return view($this->module.'.form',$this->data);
	}
	function edit( Request $request , $id ) 
	{
		$this->hook( $request , $id );
		if(!isset($this->data['row']))
			return redirect($this->module)->with('message','Record Not Found !')->with('status','error');
		if($this->access['is_edit'] ==0 )
			return redirect('dashboard')->with('message',__('core.note_restric'))->with('status','error');
		$this->data['row'] = (array) $this->data['row'];
		
		$this->data['setting'] 		= $this->info['setting'];
		$this->data['id'] = $id;
		return view($this->module.'.form',$this->data);
	}
	function show( Request $request , $id ) 
	{
		/* Handle import , export and view */
		$task =$id ;
		switch( $task)
		{
			case 'search':
				return $this->getSearch();
				break;
			case 'lookup':
				return $this->getLookup($request );
				break;
			case 'comboselect':
				return $this->getComboselect( $request );
				break;
			case 'import':
				return $this->getImport( $request );
			case 'removefiles':
				return $this->getRemovefiles( $request );	
				break;
			case 'export':
				return $this->getExport( $request );
				break;
			case 'getPetakData':
				return $this->getPetakData( $request );
				break;
			default:
				$this->hook( $request , $id );
				if(!isset($this->data['row']))
					return redirect($this->module)->with('message','Record Not Found !')->with('status','error');

				if($this->access['is_detail'] ==0) 
					return redirect('dashboard')->with('message', __('core.note_restric'))->with('status','error');

				return view($this->module.'.view',$this->data);	
				break;		
		}
	}	
	public function store( Request $request){
		config(['app.debug' => true]);
		$task = $request->input('action_task');
		switch ($task)
		{
			default:
				return $this->postData( $request);
				break;
			case 'save':
				$rules = $this->validateForm();
				$validator = Validator::make($request->all(), $rules);
				if ($validator->passes()) 
				{
					$data = $this->validatePost( $request );
					$data['entry_by'] = \Session::get('uid');
					$data['createdOn'] = date('Y-m-d H:i:s');
					$data['status_ajuan'] = 1;
					$id = $this->model->insertRow($data , $request->input( $this->info['key']));
					
					/* Insert logs */
					$this->model->logs($request , $id);
					return response()->json(array('status'=>'success','message'=> __('core.note_success')));	
					
				} 
				else {
					$message = $this->validateListError(  $validator->getMessageBag()->toArray() );
					return response()->json(array(
						'message'	=> $message,
						'status'	=> 'error'
					));	
				}
				break;
			case 'delete':
				return $result = $this->destroy( $request );
				break;

			case 'import':
				return $this->PostImport( $request );
				break;

			case 'copy':
				$result = $this->copy( $request );
				return response()->json($result);
				break;		
			case 'upload':
				return $this->upload( $request );
				break;
			case 'uploadpratebang':
				return $this->uploadpratebang( $request );
				break;	

		}
	}
	public function postData( $request)
	{ 
		
		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));

		$tables 	= $this->info['config']['grid'];
		$cols = array();
		foreach($tables as $field)
		{				
			//$cols[$this->info['key']]	= array('db'=> $field['alias'] ,$this->info['key'] );
			if($field['view'] =='1')
			{
				$cols[] = array('db'=> $field['alias'],'dt'=> $field['field'] );
			}					
		}
		$conf = DataHelpers::simple($request->all(),$cols);
		$filter =  '';
		if(!is_null($request->input('search')))
		{
			$filter .= $this->liveSearch( $request);
		}
		


		$params = array(
			'page'		=> $conf['page'] ,
			'limit'		=> $conf['limit'] ,
			'sort'		=> ($conf['order']['sort'] !='' ? $conf['order']['sort'] : $this->info['setting']['orderby']) ,
			'order'		=> ($conf['order']['by'] !='' ? $conf['order']['by'] : $this->info['setting']['ordertype']),
			'params'	=> $filter,
			'global'	=> (isset($this->access['is_global']) ? $this->access['is_global'] : 0 )
		);


		$results = $this->model->getRows($params);
		
		$array = array();
		foreach($results['rows'] as $row)
		{
			$values = array();
			$values['rowId'] = $row->{$this->info['key']};
			foreach($tables as $field)
			{			
				
				if($field['view'] =='1')
				{

						$bobot = \DB::table('master_bobot_pertruk')
						->where('kode_kebun', substr($row->rayon, 0, 4))
							->where('jenis_angkutan', $row->jenis_kendaraan_angkutan)
							->value('bobot');
						if(is_null($bobot)) $bobot = 0; 
						if (!empty($row->taksasi_ton) && is_numeric($row->taksasi_ton) && is_numeric($bobot) && $bobot > 0) {
							$estimasi = number_format($row->taksasi_ton / $bobot, 0, '.', '');
						} else {
							$estimasi = number_format(0, 0, '.', '');
						}
					if($field['field'] == "status_ajuan"){
						//cek dan count di tx_petak_tebang where id_petak
						$count = \DB::table('tx_petak_tebang')->where('id_petak', $row->lahan_id)->count();
						switch($row->{$field['field']}) {
							case 1:
								$values[$field['field']] = '<span class="badge badge-warning"><i class="fa fa-clock-o"></i> Diajukan</span>';
								break;
							case 2:
								$values[$field['field']] = '<span class="badge badge-success"><i class="fa fa-check"></i> Siap Ditebang</span>';
								if($count > 0) {
									$values[$field['field']] .= '<br><span class="badge badge-info"><i class="fa fa-check"></i> '.$count.' Rit Sudah Ditebang</span>';
								}
								break;
							default:
								$values[$field['field']] = '<span class="badge badge-secondary"><i class="fa fa-question"></i> Status Tidak Diketahui</span>';
								break;
						}
						
					}else if($field['field'] == "createdOn"){
						$values[$field['field']] = $estimasi;		
					}else if($field['field'] == "entry_by"){						
							$values[$field['field']] = $estimasi > 0 ? number_format($row->luas_poligon / $estimasi, 3, '.', '') : '0.000';
					}else if($field['field'] == "luas_poligon"){						
							$values[$field['field']] = number_format($row->luas_poligon, 3);
					}else if($field['field'] == "taksasi_ton"){						
							$values[$field['field']] = number_format($row->taksasi_ton, 3);
					}else if($field['field'] == "file_ajuan"){
						if(empty($row->{$field['field']})) {
							$values[$field['field']] = '<button class="btn btn-xs btn-primary" onclick="uploadFile('.$row->{$this->info['key']}.')"><i class="fa fa-upload"></i> Upload</button>';
						} else {
							$values[$field['field']] = '<a href="'.asset('uploads/file_ajuan_tebang/'.$row->{$field['field']}).'" target="_blank" class="btn btn-xs btn-success"><i class="fa fa-file"></i> View File</a>';
						}
					}else if($field['field'] == "file_pra_tebang"){
						if(empty($row->{$field['field']})) {
							$values[$field['field']] = '<button class="btn btn-xs btn-primary" onclick="uploadFilePraTebang('.$row->{$this->info['key']}.')"><i class="fa fa-upload"></i> Upload</button>';
						} else {
							$values[$field['field']] = '<a href="'.asset('uploads/file_pra_tebang/'.$row->{$field['field']}).'" target="_blank" class="btn btn-xs btn-success"><i class="fa fa-file"></i> View File</a>';
						}
					}else{
						$values[$field['field']] = \SiteHelpers::formatRows($row->{$field['field']}, $field , $row);
					}
					
				}	
			}
			$values['action'] =  \SiteHelpers::buttonAction($this->module,$this->access ,$row->{$this->info['key']} ,$this->info['setting']) ;
			$array[] = $values; 	
		}
		
		$data = array(
			'draw'			=> (!is_null($request->input('draw')) ? intval($request->input('draw') ) : 0), 
			'recordsTotal'	=> $results['total'] ,
			'recordsFiltered'	=> $results['total'],
			'data'				=> $array

		);
		return response()->json($data);
	}

	public function destroy( Request $request)
	{

		if(!\Auth::check()) 
			return response()->json(array(
				'status'=>'error',
				'message'=> 'You are not login'
			));

		$this->access = $this->model->validAccess($this->info['id'] , session('gid'));
		if($this->access['is_remove'] ==0) 
			return response()->json(array('status'=>'error','message'=> __('core.note_restric')));	


		// delete multipe rows 
		if(count($request->input('ids')) >=1)
		{
			$statuses = $this->model->whereIn($this->info['key'], $request->input('ids'))->pluck('status_ajuan');
			if($statuses->contains(2)) {
				return response()->json(array('status'=>'error','message'=> 'Cannot delete records with status "Siap Ditebang".'));
			}
			$ids = $request->input('ids');
			$allowed = $this->model
				->whereIn($this->info['key'], $ids)
				->where('status_ajuan', '!=', 2)
				->pluck($this->info['key'])
				->toArray();

			if (count($allowed) > 0) {
				$this->model->destroy($allowed);
			}
			
			return response()->json(array(
				'status'=>'success',
				'message'=> __('core.note_success_delete')
			));
		} else {
			return response()->json(array(
				'status'=>'error',
				'message'=> __('core.note_error')
			));

		} 		

	}

	public function upload(Request $request)
	{
		config(['app.debug' => true]);
		if(!\Auth::check()) 
			return response()->json(['success' => false, 'message' => 'You are not login']);

		$this->access = $this->model->validAccess($this->info['id'], session('gid'));
		// if($this->access['is_edit'] == 0) 
		// 	return response()->json(['success' => false, 'message' => __('core.note_restric')]);

		$id = $request->input('id');
		$file = $request->file('file');

		if (!$file || !$id) {
			return response()->json(['success' => false, 'message' => 'File or ID is missing']);
		}

		// Validate file
		$validator = Validator::make($request->all(), [
			'file' => 'required|file|max:10240|mimes:pdf,doc,docx,jpg,jpeg,png'
		]);

		if ($validator->fails()) {
			return response()->json(['success' => false, 'message' => $validator->errors()->first()]);
		}

		try {
			// Check if record exists
			$record = $this->model->find($id);
			if (!$record) {
				return response()->json(['success' => false, 'message' => 'Record not found']);
			}

			// Generate filename
			$filename = time() . '_' . $file->getClientOriginalName();
			$uploadPath = public_path('uploads/file_ajuan_tebang/');
			
			// Create directory if not exists
			if (!file_exists($uploadPath)) {
				mkdir($uploadPath, 0777, true);
			}

			// Move file to uploads directory
			$file->move($uploadPath, $filename);

			// Update database record
			$this->model->where($this->info['key'], $id)->update(['file_ajuan' => $filename, 'status_ajuan' => 2]);

			return response()->json(['success' => true, 'message' => 'File uploaded successfully']);

		} catch (\Exception $e) {
			return response()->json(['success' => false, 'message' => 'Upload failed: ' . $e->getMessage()]);
		}

	
	}

	public function uploadpratebang(Request $request)
	{
		config(['app.debug' => true]);
		if(!\Auth::check()) 
			return response()->json(['success' => false, 'message' => 'You are not login']);

		$this->access = $this->model->validAccess($this->info['id'], session('gid'));
		// if($this->access['is_edit'] == 0) 
		// 	return response()->json(['success' => false, 'message' => __('core.note_restric')]);

		$id = $request->input('id');
		$file = $request->file('file');

		if (!$file || !$id) {
			return response()->json(['success' => false, 'message' => 'File or ID is missing']);
		}

		// Validate file
		$validator = Validator::make($request->all(), [
			'file' => 'required|file|max:10240|mimes:pdf,doc,docx,jpg,jpeg,png'
		]);

		if ($validator->fails()) {
			return response()->json(['success' => false, 'message' => $validator->errors()->first()]);
		}

		try {
			// Check if record exists
			$record = $this->model->find($id);
			if (!$record) {
				return response()->json(['success' => false, 'message' => 'Record not found']);
			}

			// Generate filename
			$filename = time() . '_' . $file->getClientOriginalName();
			$uploadPath = public_path('uploads/file_pra_tebang/');
			
			// Create directory if not exists
			if (!file_exists($uploadPath)) {
				mkdir($uploadPath, 0777, true);
			}

			// Move file to uploads directory
			$file->move($uploadPath, $filename);

			// Update database record
			$this->model->where($this->info['key'], $id)->update(['file_pra_tebang' => $filename]);

			return response()->json(['success' => true, 'message' => 'File uploaded successfully']);

		} catch (\Exception $e) {
			return response()->json(['success' => false, 'message' => 'Upload failed: ' . $e->getMessage()]);
		}

	
	}

		public function getPetakData(Request $request)
		{
			$kode_kebun = $request->input('kebun');
			$kode_rayon = $request->input('rayon');
			$afdeling = $request->input('afdeling');
			
			// if (!$kode_kebun && !$kode_rayon && !$afdeling) {
			// 	return response()->json(['success' => false, 'message' => 'At least one parameter is required']);
			// }
			
			try {
				// Query 1: Data dari tx_petak_tebang
				$query1 = \DB::table('tx_petak_tebang as a')
					->join('q_takdes_petak as b', 'b.lahan_id', '=', 'a.id_petak')
					->selectRaw('count(*) as jml_petak');
					
				if ($kode_kebun) {
					$query1->where('b.kode_kebun', $kode_kebun);
				}
				if ($kode_rayon) {
					$query1->where('b.kode_rayon', $kode_rayon);
				}
				if ($afdeling) {
					$query1->where('b.afdeling', $afdeling);
				}
				
				$result1 = $query1->first();
				
				// Query 2: Data dari tx_pos_keluar
				$query2 = \DB::table('tx_pos_keluar as a')
					->join('q_takdes_petak as b', 'b.lahan_id', '=', \DB::raw("SUBSTRING_INDEX(SUBSTRING_INDEX(a.kode_booking, '-', 2), '-', -1)"))
					->selectRaw('count(*) as jml_petak');
					
				if ($kode_kebun) {
					$query2->where('b.kode_kebun', $kode_kebun);
				}
				if ($kode_rayon) {
					$query2->where('b.kode_rayon', $kode_rayon);
				}
				if ($afdeling) {
					$query2->where('b.afdeling', $afdeling);
				}
				
				$result2 = $query2->first();
				
				return response()->json([
					'success' => true,
					'data' => [
						'petak_tebang' => $result1->jml_petak ?? 0,
						'pos_keluar' => $result2->jml_petak ?? 0
					]
				]);
				
			} catch (\Exception $e) {
				return response()->json(['success' => false, 'message' => 'Query failed: ' . $e->getMessage()]);
			}
		}
}