<?php namespace App\Http\Controllers;

use App\Models\Mastertemplate;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Validator, Input, Redirect ; 

class MastertemplateController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'mastertemplate';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Mastertemplate();
		
		$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'		=> 'mastertemplate',
			'pageUrl'			=>  url('mastertemplate'),
			'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('mastertemplate.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 ) 
	{
		config(['app.debug' => true]);
		$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 'buildertemplate':
				return $this->buildertemplate( $request );
				break;
			case 'readModuleFile':
				return $this->readModuleFile( $request );
				break;
			case 'load_page':
				return $this->load_page( $request );
				break;	
			case 'main_page':
				return $this->main_page($request);
				break;	
			case 'viewIndex':
				return $this->viewIndex($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');

				$getdata = \DB::table('master_template')->where('id', $id)->first();
					if(!$getdata)
					{
						return response()->json(array(
							'status'=>'error',
							'message'=> 'Record Not Found'
						));
					}
					$content = '';
					$moduleFolder = base_path('resources/views/' . $this->module. '/template');
					$filePath = $moduleFolder . '/' . $getdata->filename;
					if (is_file($filePath)) {
						$content = file_get_contents($filePath);
					} else {
						$content = 'File not found.';
					}

					$this->data['content'] = $content;
				return view($this->module.'.view',$this->data);	
				break;		
		}
	}	
	public function store( Request $request){

		$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 );
					$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 'saveLayout':
				return $this->saveLayout($request);
				break;

		}
	}
	public function postData( $request)
	{ 
		config(['app.debug' => true]);
		$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')
				{
					if($field['field'] == 'users'){
						$userIds = explode(',', $row->users);
						$userNames = \DB::table('tb_users')->whereIn('id', $userIds)->pluck('first_name')->toArray();
						$badges = array_map(function($name) {
							return '<span class="label label-info">'.$name.'</span>';
						}, $userNames);
						$values[$field['field']] = implode(' ', $badges);
						continue;
					}
					$values[$field['field']] = \SiteHelpers::formatRows($row->{$field['field']}, $field , $row);
				}	
			}
			$action = '';
			if($this->access['is_detail'] == 1) {
				if($this->info['setting']['view-method'] != 'expand') {
					$onclick = " onclick=\"ajaxViewDetail('#".$this->module."',this.href); return false; \"" ;
					if($this->info['setting']['view-method'] == 'modal')
						$onclick = " onclick=\"SximoModal(this.href,'View Detail'); return false; \"" ;
					$action .= '<a href="'.url($this->module.'/'.$row->{$this->info['key']}).'" '.$onclick.' class="btn btn-sm btn-info">' . __('core.btn_view') . '</a> ';
				}
			}
			if($this->access['is_edit'] == 1) {
				$onclick = " onclick=\"ajaxViewDetail('#".$this->module."',this.href); return false; \"" ;
				if($this->info['setting']['form-method'] == 'modal')
					$onclick = " onclick=\"SximoModal(this.href,'Edit Form'); return false; \"" ;
				$action .= '<a href="'.url($this->module.'/'.$row->{$this->info['key']}).'/edit" '.$onclick.' class="btn btn-sm btn-warning">' . __('core.btn_edit') . '</a> ';
			}
			$action .= '<button type="button" class="btn btn-sm btn-secondary" onclick="copyLinkToClipboard(\''.url($this->module.'/viewIndex?id='.md5($row->{$this->info['key']}.'1234Template')).'\')">Copy Link</button>';
			$values['action'] = $action;

			$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);
	}

	function buildertemplate( Request $request) 
	{
		// config(['app.debug' => true]);
		$userGroups = \DB::table('master_template')
			->where('id', '!=', $request->input('id'))
			->select('users')
			->get()
			->pluck('users')
			->filter()
			->flatMap(function($users) {
				return explode(',', $users);
			})
			->unique()
			->values()
			->all();

		$this->data['userGroups'] = $userGroups;
		$getdata = \DB::table('master_template')->where('id', $request->input('id'))->first();
		$this->data['row'] = $getdata;
		$getdatamodule = \DB::table('master_konten')->get();
		$this->data['module'] = $getdatamodule;
		$this->data['users'] = \DB::table('tb_users')
			->select('id', 'first_name', 'email')
			->whereNotIn('group_id', [11, 12])
			->whereNotIn('id', $userGroups)
			->get();

		return view($this->module.'.template',$this->data);
	}

	public function load_page(Request $request)
	{
				$getdata = \DB::table('master_template')
					->whereRaw("FIND_IN_SET(?, users)", [session('uid')])
					->first();
					if(!$getdata)
					{
						return response()->json(array(
							'status'=>'error',
							'message'=> 'Record Not Found'
						));
					}
					$content = '';
					$moduleFolder = base_path('resources/views/' . $this->module. '/template');
					$filePath = $moduleFolder . '/' . $getdata->filename;
					if (is_file($filePath)) {
						$content = file_get_contents($filePath);
					} else {
						$content = 'File not found.';
					}

					$this->data['content'] = $content;
				return view($this->module.'.page',$this->data);	
	}

	public function main_page(Request $request)
	{

				$getdata = \DB::table('master_template')
					->whereRaw("FIND_IN_SET(?, users)", [session('uid')])
					->first();
					if(!$getdata)
					{
						return response()->json(array(
							'status'=>'error',
							'message'=> 'Record Not Found'
						));
					}
					$content = '';
					$moduleFolder = base_path('resources/views/' . $this->module. '/template');
					$filePath = $moduleFolder . '/' . $getdata->filename;
					if (is_file($filePath)) {
						$content = file_get_contents($filePath);
					} else {
						$content = 'File not found.';
					}

					$this->data['content'] = $content;
				return view($this->module.'.mainpage',$this->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)
		{
			$this->model->destroy($request->input('ids'));
			
			return response()->json(array(
				'status'=>'success',
				'message'=> __('core.note_success_delete')
			));
		} else {
			return response()->json(array(
				'status'=>'error',
				'message'=> __('core.note_error')
			));

		} 		

	}
	public function readModuleFile(Request $request)
	{
		$moduleId = $request->input('moduleid');
		$module = \DB::table('master_konten')->where('id', $moduleId)->first();

		if (!$module || empty($module->filename)) {
			return response()->json([
				'status' => 'error',
				'message' => 'Module or filename not found'
			]);
		}

		$filePath = resource_path('views/masterkonten/module/' . $module->filename);

		if (!file_exists($filePath)) {
			return response()->json([
				'status' => 'error',
				'message' => 'File not found'
			]);
		}

		$content = file_get_contents($filePath);

		return response()->json([
			'status' => 'success',
			'filename' => $module->filename,
			'content' => $content
		]);
	}

	public function saveLayout(Request $request)
	{
		
		$layoutContent = $request->input('layout_content') ?? $request->input('layout');
		$name = $request->input('name');
		$desc = $request->input('desc');
		$users = $request->input('users');

		if (!$layoutContent) {
			return response()->json([
				'status' => 'error',
				'message' => 'Template ID and layout content are required.'
			]);
		}

		
		// Overwrite file if editing, otherwise create new file
		if ($request->input('id')) {
			$template = \DB::table('master_template')->where('id', $request->input('id'))->first();
			$filename = $template && $template->filename ? $template->filename : uniqid('template_') . '.blade.php';
		} else {
			$filename = uniqid('template_') . '.blade.php';
		}
		$folderPath = resource_path('views/mastertemplate/template');
		if (!is_dir($folderPath)) {
			mkdir($folderPath, 0775, true);
		}
		$filePath = $folderPath . '/' . $filename;
		file_put_contents($filePath, $layoutContent);

		if ($request->input('id')) {
			$updateData = [];
			if ($name !== null) $updateData['title'] = $name;
			if ($desc !== null) $updateData['deskripsi'] = $desc;
			$updateData['filename'] = $filename;
			if ($users !== null) $updateData['users'] = implode(',', $users);
			 else $updateData['users'] = '';
			$updateData['entry_by'] = session('uid');
			$updateData['createdOn'] = date('Y-m-d H:i:s');

			$update = \DB::table('master_template')->where('id', $request->input('id'))->update($updateData);

			if ($update) {
				return response()->json([
					'status' => 'success',
					'message' => 'Layout updated successfully.'
				]);
			} else {
				return response()->json([
					'status' => 'error',
					'message' => 'Failed to update layout.'
				]);
			}
		}else{
		$updateData = ['filename' => $filename];
		if ($name !== null) $updateData['title'] = $name;
		if ($desc !== null) $updateData['deskripsi'] = $desc;
		$updateData['entry_by'] = session('uid');
		$updateData['createdOn'] = date('Y-m-d H:i:s');

		$update = \DB::table('master_template')->insert($updateData);

		if ($update) {
			return response()->json([
				'status' => 'success',
				'message' => 'Layout saved successfully.'
			]);
		} else {
			return response()->json([
				'status' => 'error',
				'message' => 'Failed to save layout.'
			]);
		}
	}
	}

	public function viewIndex(Request $request)
	{
			$id = $request->input('id');
			$getdata = \DB::table('master_template')->whereRaw('MD5(CONCAT(id, "1234Template")) = ?', [$id])->first();
					if(!$getdata)
					{
						return response()->json(array(
							'status'=>'error',
							'message'=> 'Record Not Found'
						));
					}
					$content = '';
					$moduleFolder = base_path('resources/views/' . $this->module. '/template');
					$filePath = $moduleFolder . '/' . $getdata->filename;
					if (is_file($filePath)) {
						$content = file_get_contents($filePath);
					} else {
						$content = 'File not found.';
					}

					$this->data['content'] = $content;
				return view($this->module.'.mainpage',$this->data);	
	}
}