<?php namespace App\Http\Controllers;

use App\Models\Masterkonten;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Illuminate\Support\Facades\Http;
use Validator, Input, Redirect ; 

class MasterkontenController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'masterkonten';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Masterkonten();
		
		$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'		=> 'masterkonten',
			'pageUrl'			=>  url('masterkonten'),
			'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('masterkonten.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 builderkonten( Request $request) 
	{
				config(['app.debug' => true]);
		$getdataprocedure = \DB::table('master_api_data')->get();
		$getdata = \DB::table('master_konten')->where('id', $request->input('id'))->first();
		$this->data['row'] = $getdata;
		$this->data['getdataprocedure'] = $getdataprocedure;

		return view($this->module.'.conten',$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 'builderkonten':
				return $this->builderkonten( $request );
				break;
			case 'showContent':
				return $this->showContent( $request);
				break;
			case 'load_content':
				return $this->load_content($request);
				break;	
			case 'load_content_mobile':
				return $this->load_content_mobile($request);
				break;
			case 'view_mobile':
				return $this->view_mobile($request);
				break;	
			case 'load':
				return $this->load($request);
				break;
			case 'content':
				return $this->content($request);
				break;	
			
			case 'preview_content':
				return $this->preview_content( $request );
				break;		
				
			default:

				if(strpos($id, '.html') !== false)
				{
					$request->merge(['page' => $id]);
					return $this->load_content_mobile($request);
				}
				$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_konten')->where('id', $id)->first();
					if(!$getdata)
					{
						return response()->json(array(
							'status'=>'error',
							'message'=> 'Record Not Found'
						));
					}
					
					$content = '';
					$moduleFolder = base_path('resources/views/' . $this->module. '/module');
					$filePath = $moduleFolder . '/' . $getdata->filename;
					if (is_file($filePath)) {
						$content = file_get_contents($filePath);
					} else {
						$content = 'File not found.';
					}
					$bladeFile = str_replace('.blade.php', '', $getdata->filename);
					$this->data['content'] = view($this->module.'.module.'.$bladeFile, $this->data)->with('content', $content)->render();
				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 'save_server':
				return $this->save_server( $request );
				break;

			case 'preview_content':
				return $this->preview_content( $request );
				break;			
			case 'createfilepreview':
				return $this->createfilepreview( $request );
				break;
			case 'copy':
				$result = $this->copy( $request );
				return response()->json($result);
				break;		
			case 'generatebyAi':
				return $this->generatebyAi( $request );
				break;
			case 'generateAiEditor':
				return $this->generateAiEditor( $request );
				break;
			case 'savecontent':
				return $this->savecontent( $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')
				{
			
					$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.'/load?id='.md5($row->{$this->info['key']}.'myencryption')).'\')">Copy Link</button>';
				$action .= '<button type="button" class="btn btn-sm btn-success" onclick="copyLinkToClipboard(\''.url($this->module.'/load_content?id='.md5($row->{$this->info['key']}.'myencryption')).'\')">Copy Content</button>';
				$action .= '<button type="button" class="btn btn-sm btn-primary" onclick="copyIframeToClipboard(\''.url($this->module.'/load_content?id='.md5($row->{$this->info['key']}.'myencryption')).'\')">Copy Iframe</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);
	}

	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)
		{
			$filenames = \DB::table('master_konten')
				->whereIn('id', $request->input('ids'))
				->pluck('filename');

			$moduleFolder = base_path('resources/views/' . $this->module . '/module');

			foreach ($filenames as $filename) {
				$filePath = $moduleFolder . '/' . $filename;
				if (is_file($filePath)) {
					@unlink($filePath);
				}
			}
			\DB::table('master_konten')->whereIn('id', $request->input('ids'))->delete();
			$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 load_content(Request $request){
		// config(['app.debug' => true]);
		$id = $request->input('id');
		$getdata = \DB::table('master_konten')
			->whereRaw('MD5(concat(id,"myencryption")) = ?', [$id])
			->first();
		if(!$getdata)
		{
			return response()->json(array(
				'status'=>'error',
				'message'=> 'Record Not Found'
			));
		}
		$content = '';
		$moduleFolder = base_path('resources/views/' . $this->module. '/module');
		$filePath = $moduleFolder . '/' . $getdata->filename;
		if (is_file($filePath)) {
			$content = file_get_contents($filePath);
		} else {
			$content = 'File not found.';
		}

		$bladeFile = str_replace('.blade.php', '', $getdata->filename);
		$this->data['content'] = view($this->module.'.module.'.$bladeFile, $this->data)->with('content', $content)->render();
		return view($this->module.'.page',$this->data);
	}

	public function load(Request $request){
		// config(['app.debug' => true]);
		$id = $request->input('id');
		$getdata = \DB::table('master_konten')
			->whereRaw('MD5(concat(id,"myencryption")) = ?', [$id])
			->first();
		if(!$getdata)
		{
			return response()->json(array(
				'status'=>'error',
				'message'=> 'Record Not Found'
			));
		}
		$content = '';
		$moduleFolder = base_path('resources/views/' . $this->module. '/module');
		$filePath = $moduleFolder . '/' . $getdata->filename;
		if (is_file($filePath)) {
			$content = file_get_contents($filePath);
		} else {
			$content = 'File not found.';
		}

		$bladeFile = str_replace('.blade.php', '', $getdata->filename);
		$this->data['content'] = view($this->module.'.module.'.$bladeFile, $this->data)->with('content', $content)->render();
		return view($this->module.'.load',$this->data);
	}
	

	public function content(Request $request)
{
			if(!\Auth::check()) 
			return redirect('user/login')->with('status', 'error')->with('message','You are not login');
    $file = $request->get('file');

    // validasi file agar tidak bisa membaca file sembarangan
    if (!$this->isAllowedBladeFile($file)) {
        return response()->json([
            'success' => false,
            'message' => 'File tidak diizinkan'
        ], 403);
    }

    $path = resource_path('views/dashboard/' . $file);

    if (!file_exists($path)) {
        return response()->json([
            'success' => false,
            'message' => 'File tidak ditemukan'
        ], 404);
    }

    $content = file_get_contents($path);

    /*
    |--------------------------------------------------------------------------
    | Tambahkan data-source-line otomatis
    |--------------------------------------------------------------------------
    */

    $lines = explode("\n", $content);

    foreach ($lines as $index => &$line) {

        $lineNumber = $index + 1;

        /*
         * Cari tag HTML pembuka.
         *
         * Contoh:
         *
         * <div class="card">
         *
         * menjadi:
         *
         * <div data-source-line="10" class="card">
         *
         * Tidak memproses:
         * - komentar
         * - closing tag </div>
         * - directive Blade @if, @foreach, dll
         */

        $line = preg_replace_callback(
            '/<([a-zA-Z][a-zA-Z0-9:-]*)(\s[^<>]*|)>/',
            function ($matches) use ($lineNumber) {

                $tag = $matches[1];
                $attributes = $matches[2];

                // Jangan tambahkan jika sudah ada
                if (strpos($attributes, 'data-source-line=') !== false) {
                    return $matches[0];
                }

                return '<' .
                    $tag .
                    ' data-source-line="' . $lineNumber . '"' .
                    $attributes .
                    '>';
            },
            $line
        );
    }

    unset($line);

    $content = implode("\n", $lines);

    return response()->json([
        'success' => true,
        'content' => $content
    ]);
}

	public function savecontent(Request $request)
	{
		$file = $request->file;
		$content = $request->content;

		// Cegah path traversal
		if (!preg_match('/^[a-zA-Z0-9_-]+$/', $file)) {
			return response()->json([
				'success' => false,
				'message' => 'Nama file tidak valid.'
			], 400);
		}

		$path = resource_path(
			'views/dashboard/' . $file . '.blade.php'
		);

		if (!$this->isAllowedBladeFile($file.'.blade.php')) {
			return response()->json([
				'success' => false,
				'message' => 'File tidak diizinkan'
			], 403);
		}

		
		if (!file_exists($path)) {
			return response()->json([
				'success' => false,
				'message' => 'File tidak ditemukan.'
			], 404);
		}

		file_put_contents($path, $content, LOCK_EX);

		return response()->json([
			'success' => true,
			'message' => $file . '.blade.php berhasil disimpan.'
		]);
	}

	private function isAllowedBladeFile($file)
	{
		$allowed = [
			'index.blade.php',
			'index2.blade.php',
			'index3.blade.php',
		];


		return in_array($file, $allowed);
	}

	public function createfilepreview(Request $request){
		config(['app.debug' => true]);
		$html = $request->input('content');
				$moduleFolder = base_path('resources/views/' . $this->module. '/temp');

		if (!is_dir($moduleFolder)) {
			mkdir($moduleFolder, 0755, true);
		}
		$filename = 'temp_' . session('uid') . '.blade.php';
		$filePath = $moduleFolder . '/' . $filename;
		file_put_contents($filePath, $html);
		return response()->json(array(
			'status'=>'success',
			'message'=> 'File preview created',
			'filename' => $filename
		));
	}
	public function preview_content(Request $request){
		config(['app.debug' => true]);
		$filename = str_replace('.blade.php', '', $request->input('filename'));
		$this->data['content'] = view($this->module.'.temp.'.$filename, $this->data)->render();
		return view($this->module.'.page',$this->data);
	}	


	public function load_content_mobile(Request $request){
		// config(['app.debug' => true]);
		$page = $request->input('page', 'index.html');
		$content = '';
		$moduleFolder = base_path('resources/views/' . $this->module. '/mobile');
		$filePath = $moduleFolder . '/' . $page;
		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 view_mobile(Request $request){

		// config(['app.debug' => true]);
		$this->data['url'] = "masterkonten/load_content_mobile";
		return view($this->module.'.pagemobile',$this->data);
	}

	public function save_server(Request $request)
	{
		$rules = [
			'filename' => 'required|string|max:255',
			'content' => 'required|string',
		];
		$validator = Validator::make($request->all(), $rules);

		if ($validator->fails()) {
			return response()->json([
				'status' => 'error',
				'message' => $validator->errors()->first()
			]);
		}

		$filename = preg_replace('/[^a-zA-Z0-9_\-\.]/', '', $request->input('filename'));
		if (!preg_match('/\.blade\.php$/i', $filename)) {
			$filename .= '.blade.php';
		}
		$content = $request->input('content');
		$moduleFolder = base_path('resources/views/' . $this->module. '/module');

		if (!is_dir($moduleFolder)) {
			mkdir($moduleFolder, 0755, true);
		}

		$filePath = $moduleFolder . '/' . $filename;

		try {
			if ($request->input('id')) {
				$datainsert = \DB::table('master_konten')->where('id', $request->input('id'))->update([
					'title' => $request->input('modalTitle'),
					'deskripsi' => $request->input('modalDesc'),
					'table' => $request->input('modalTable'),
					'method' => $request->input('modalMethod'),
					'filename' => $filename,
					'createdOn' => date('Y-m-d H:i:s'),
					'entry_by' => \Auth::user()->id
				]);
			} else {
				$datainsert = \DB::table('master_konten')->insert([
					'title' => $request->input('modalTitle'),
					'deskripsi' => $request->input('modalDesc'),
					'table' => $request->input('modalTable'),
					'method' => $request->input('modalMethod'),
					'filename' => $filename,
					'createdOn' => date('Y-m-d H:i:s'),
					'entry_by' => \Auth::user()->id
				]);
			}
			if (!$datainsert) {
				return response()->json([
					'status' => 'error',
					'message' => 'Gagal menyimpan data ke database.'
				]);
			}else{
				file_put_contents($filePath, $content);
			return response()->json([
				'status' => 'success',
				'message' => 'File berhasil disimpan.'
			]);
			}
			
		} catch (\Exception $e) {
			return response()->json([
				'status' => 'error',
				'message' => 'Gagal menyimpan file: ' . $e->getMessage()
			]);
		}
	}

	public function generateAiEditor(Request $request)
	{
		config(['app.debug' => true]);
		 

        $request->validate([
            'file' => 'required|string',
            'line' => 'required|integer|min:1',
            'prompt' => 'required|string',
            'before' => 'nullable|string',
            'current' => 'nullable|string',
            'after' => 'nullable|string',
            'full_content' => 'nullable|string',
        ]);


        /*
        |--------------------------------------------------------------------------
        | VALIDASI FILE
        |--------------------------------------------------------------------------
        */

        $file = $request->file;

        if (!str_ends_with($file, '.blade.php')) {
            $file .= '.blade.php';
        }

        if (!$this->isAllowedBladeFile($file)) {

            return response()->json([
                'success' => false,
                'message' => 'File Blade tidak diizinkan.'
            ], 403);

        }


        /*
        |--------------------------------------------------------------------------
        | DATA AI
        |--------------------------------------------------------------------------
        */

        $line = (int) $request->line;

        $prompt = trim($request->prompt);

        $before = $request->before ?? '';

        $current = $request->current ?? '';

        $after = $request->after ?? '';


        /*
        |--------------------------------------------------------------------------
        | SYSTEM PROMPT
        |--------------------------------------------------------------------------
        */

				$systemPrompt = <<<'PROMPT'

		Anda adalah AI Coding Assistant untuk Laravel Blade.

		Tugas Anda adalah menghasilkan kode yang akan INSERT ke source code
		Laravel Blade pada LINE tertentu.

		ATURAN PENTING:

		1. Output HARUS berupa kode yang siap ditempelkan langsung ke file.

		2. JANGAN gunakan markdown code fence seperti:
		```html
		JANGAN memberikan penjelasan sebelum atau sesudah kode.
		HANYA keluarkan kode yang diminta.
		Pertahankan struktur kode yang sudah ada.
		Jangan menghapus kode existing.

		Jangan membuat:
		@extends
		@section
		@yield

		kecuali memang diminta secara eksplisit.

		Jika membutuhkan HTML, gunakan HTML yang valid.
		Jika membutuhkan Blade, gunakan sintaks Blade Laravel yang valid.
		Jika membutuhkan JavaScript, pastikan syntax JavaScript valid.
		Jika membutuhkan CSS, jangan merusak CSS existing.
		Jangan membuat dependency/library baru kecuali diminta.
		Gunakan variable yang sudah tersedia jika memungkinkan.
		Perhatikan konteks kode sebelum dan sesudah line target.
		Kode harus cocok ditempatkan pada posisi line yang diberikan.
		Jangan mengembalikan JSON.
		Jangan mengembalikan komentar seperti:
		"Berikut kodenya:"
		atau
		"Kode hasil:"
		Jika permintaan tidak membutuhkan kode tambahan, tetap berikan
		kode yang paling relevan untuk memenuhi permintaan.

		PROMPT;

			/*
			|--------------------------------------------------------------------------
			| USER MESSAGE
			|--------------------------------------------------------------------------
			*/

			$userMessage = <<<PROMPT

		File:
		{$file}

		Target line:
		{$line}

		Permintaan user:
		{$prompt}

		==============================
		CODE SEBELUM TARGET

		{$before}

		==============================
		CODE PADA TARGET

		{$current}

		==============================
		CODE SESUDAH TARGET

		{$after}

		==============================
		INSTRUKSI

		Buatkan kode yang dapat langsung disisipkan pada target line.

		Jangan mengubah atau menghapus kode existing.

		Output hanya kode hasil akhirnya.

		PROMPT;

	 /*
    |--------------------------------------------------------------------------
    | CONFIG AI
    |--------------------------------------------------------------------------
    |
    | Sesuaikan dengan konfigurasi project Anda.
    |
    */


	$apiKey = env('AI_KEY');
	$apiUrl = env('AI_URL');
	$model  = env('AI_MODEL');


    if (!$apiUrl) {

        return response()->json([
            'success' => false,
            'message' => 'AI API URL belum dikonfigurasi.'
        ], 500);

    }

    if (!$apiKey) {

        return response()->json([
            'success' => false,
            'message' => 'AI API Key belum dikonfigurasi.'
        ], 500);

    }

    if (!$model) {

        return response()->json([
            'success' => false,
            'message' => 'AI Model belum dikonfigurasi.'
        ], 500);

    }

	 /*
    |--------------------------------------------------------------------------
    | CALL AI
    |--------------------------------------------------------------------------
    */

		$response = Http::withToken($apiKey)
			->acceptJson()
			->timeout(180)
			->post($apiUrl, [

				'model' => $model,

				'messages' => [

					[
						'role' => 'system',
						'content' => $systemPrompt
					],

					[
						'role' => 'user',
						'content' => $userMessage
					]

				],

				'temperature' => 0.2,

				'max_tokens' => 12000

			]);


		/*
		|--------------------------------------------------------------------------
		| HTTP ERROR
		|--------------------------------------------------------------------------
		*/

		if (!$response->successful()) {

			return response()->json([
				'success' => false,
				'message' => 'AI API error.',
				'status' => $response->status(),
				'error' => $response->json()
			], 500);

		}


		/*
		|--------------------------------------------------------------------------
		| RESPONSE
		|--------------------------------------------------------------------------
		*/

		$result = $response->json();


		$code = data_get(
			$result,
			'choices.0.message.content'
		);
		if (!$code) {
			return response()->json([
				'success' => false,
				'message' => 'AI tidak menghasilkan kode.'
			], 500);
		}

		return response()->json([
			'success' => true,
			'code' => trim($code),
			'line' => (int) $request->line
		]);
	}
	

	// buatkan fungsi untuk generate text ai berupa code untuk url api ainya ini https://ai.ksotebu.com/v1/chat/completions menggunakan curl dan method post dengan parameter prompt, model, max_tokens, temperature, top_p, frequency_penalty, presence_penalty, stop 
	public function generatebyAi(Request $request)
		{
			try {

				/*
				|--------------------------------------------------------------------------
				| 1. Ambil JSON request
				|--------------------------------------------------------------------------
				*/

				$mode         = $request->input('mode', 'manual');
				$output       = $request->input('output', 'html');
				$procedureId  = $request->input('procedure_id');
				$prompt       = trim($request->input('prompt', ''));
				$currentCode  = $request->input('current_code');
				$procedure    = $request->input('procedure', []);

				/*
				|--------------------------------------------------------------------------
				| 2. Validasi dasar
				|--------------------------------------------------------------------------
				*/

				if (empty($prompt)) {
					return response()->json([
						'status'  => 'error',
						'message' => 'Prompt tidak boleh kosong.'
					], 422);
				}

				if ($mode === 'procedure' && empty($procedureId)) {
					return response()->json([
						'status'  => 'error',
						'message' => 'Stored Procedure belum dipilih.'
					], 422);
				}

				if ($mode === 'replacecode' && empty($currentCode)) {
					return response()->json([
						'status'  => 'error',
						'message' => 'Current code tidak boleh kosong.'
					], 422);
				}

				/*
				|--------------------------------------------------------------------------
				| 3. Konfigurasi AI
				|--------------------------------------------------------------------------
				*/

				$apiKey = env('AI_KEY');
				$apiUrl = env('AI_URL');
				$model  = env('AI_MODEL');

				if (!$apiKey || !$apiUrl || !$model) {
					return response()->json([
						'status'  => 'error',
						'message' => 'Konfigurasi AI belum lengkap.'
					], 500);
				}

				/*
				|--------------------------------------------------------------------------
				| 4. System Prompt
				|--------------------------------------------------------------------------
				*/

				$systemPrompt = <<<PROMPT
		Anda adalah AI UI Generator untuk Laravel Blade.

		Tugas Anda adalah membuat kode HTML, CSS dan JavaScript
		yang siap digunakan langsung di dalam Laravel Blade.

		ATURAN:

		1. Hanya kembalikan kode.
		2. Jangan gunakan markdown code fence.
		3. Jangan memberikan penjelasan.
		4. Jangan memberikan teks sebelum atau sesudah kode.
		5. Gunakan Bootstrap dan jQuery jika diperlukan.
		6. Jika output berupa Highcharts, gunakan Highcharts.
		7. Jangan membuat data dummy jika data berasal dari AJAX.
		8. Gunakan AJAX sesuai endpoint yang diberikan.
		9. Jangan mengubah endpoint AJAX.
		10. Jangan mengubah nama parameter Stored Procedure.
		11. Gunakan response JSON yang diberikan.
		12. Jika response mempunyai data.data, gunakan data.data.
		13. Buat UI responsive.
		14. Gunakan loading state.
		15. Gunakan error handling AJAX.
		16. Jangan menambahkan dependency eksternal yang tidak diperlukan.
		17. Semua ID HTML harus unik.
		18. Kode harus siap ditempel langsung ke Content Builder.

		KHUSUS MODE PROCEDURE:

		Gunakan informasi berikut sebagai sumber data:

		- procedure.title
		- procedure.parameters
		- procedure.response
		- procedure.ajax_url
		- procedure.filters
		- procedure.ui.filter_scripts

		Jangan membuat parameter Stored Procedure yang tidak terdapat
		pada procedure.parameters.

		Jika terdapat filter:

		kode_kebun
		cluster
		kode_rayon

		gunakan filter tersebut sesuai data procedure.filters.

		Jika tersedia procedure.ui.filter_scripts,
		gunakan script tersebut untuk membuat filter.

		KHUSUS OUTPUT HIGHCHART:

		Gunakan data hasil AJAX sebagai sumber series/categories.

		KHUSUS OUTPUT TABLE:

		Buat tabel responsive dan generate row berdasarkan
		response AJAX.

		HASIL AKHIR HARUS LANGSUNG BERUPA KODE HTML/CSS/JAVASCRIPT.
		PROMPT;

				/*
				|--------------------------------------------------------------------------
				| 5. Bentuk context JSON
				|--------------------------------------------------------------------------
				*/

				$context = [
					'mode' => $mode,

					'output' => $output,

					'prompt' => $prompt,
				];

				/*
				|--------------------------------------------------------------------------
				| 6. Current Code
				|--------------------------------------------------------------------------
				*/

				if ($mode === 'replacecode') {

					$context['current_code'] = $currentCode;

				}

				/*
				|--------------------------------------------------------------------------
				| 7. Stored Procedure
				|--------------------------------------------------------------------------
				*/

				if ($mode === 'procedure') {

					$context['procedure'] = [
						'id' => $procedureId,

						'title' => $procedure['title'] ?? '',

						'parameters' => $procedure['parameters'] ?? '',

						'response' => $procedure['response'] ?? '',

						'ajax_url' => $procedure['ajax_url']
							?? url('interfacedata/runProcedure?id=' . $procedureId),
						'ajax_rules' => $procedure['ajax_rules'] ?? '',

						'library_rules' => $procedure['library_rules'] ?? '',

						'filters' => [
							'kode_kebun' => (bool) (
								$procedure['filters']['kode_kebun'] ?? false
							),

							'cluster' => (bool) (
								$procedure['filters']['cluster'] ?? false
							),

							'kode_rayon' => (bool) (
								$procedure['filters']['kode_rayon'] ?? false
							),
						],

						'ui' => [
							'filter_library' => $procedure['ui']['filter_library']
								?? null,

							'filter_scripts' => $procedure['ui']['filter_scripts']
								?? [],
						],
					];
				}

				/*
				|--------------------------------------------------------------------------
				| 8. JSON context
				|--------------------------------------------------------------------------
				*/

				$jsonContext = json_encode(
					$context,
					JSON_PRETTY_PRINT |
					JSON_UNESCAPED_UNICODE |
					JSON_UNESCAPED_SLASHES
				);

				/*
				|--------------------------------------------------------------------------
				| 9. User message ke AI
				|--------------------------------------------------------------------------
				*/

				$userMessage = <<<PROMPT
		Buatkan UI berdasarkan context JSON berikut.

		$jsonContext

		Ikuti semua aturan pada system prompt.

		Kembalikan hanya kode HTML, CSS dan JavaScript.
		Jangan gunakan markdown.
		PROMPT;

				/*
				|--------------------------------------------------------------------------
				| 10. Request ke AI
				|--------------------------------------------------------------------------
				*/

				$response = Http::withToken($apiKey)
					->acceptJson()
					->timeout(180)
					->post($apiUrl, [

						'model' => $model,

						'messages' => [

							[
								'role' => 'system',
								'content' => $systemPrompt
							],

							[
								'role' => 'user',
								'content' => $userMessage
							]

						],

						'temperature' => 0.2,

						'max_tokens' => 12000
					]);

				/*
				|--------------------------------------------------------------------------
				| 11. Error AI
				|--------------------------------------------------------------------------
				*/

				if (!$response->successful()) {

					return response()->json([
						'status' => 'error',
						'message' => 'AI API error.',
						'error' => $response->json() ?: $response->body()
					], $response->status());
				}

				/*
				|--------------------------------------------------------------------------
				| 12. Ambil hasil AI
				|--------------------------------------------------------------------------
				*/

				$result = $response->json();

				$generatedCode = data_get(
					$result,
					'choices.0.message.content'
				);

				if (empty($generatedCode)) {

					return response()->json([
						'status' => 'error',
						'message' => 'AI tidak mengembalikan kode.'
					], 500);
				}

				/*
				|--------------------------------------------------------------------------
				| 13. Bersihkan markdown code fence
				|--------------------------------------------------------------------------
				*/

				$generatedCode = trim($generatedCode);

				$generatedCode = preg_replace(
					'/^```(?:html|blade|javascript|js)?\s*/i',
					'',
					$generatedCode
				);

				$generatedCode = preg_replace(
					'/\s*```$/',
					'',
					$generatedCode
				);

				$generatedCode = trim($generatedCode);

				/*
				|--------------------------------------------------------------------------
				| 14. Return
				|--------------------------------------------------------------------------
				*/

				return response()->json([
					'status' => 'success',
					'data' => $generatedCode,
					'meta' => [
						'mode' => $mode,
						'output' => $output,
						'procedure_id' => $procedureId
					]
				]);

			} catch (\Throwable $e) {

				\Log::error('generatebyAi error', [
					'message' => $e->getMessage(),
					'line' => $e->getLine(),
					'file' => $e->getFile()
				]);

				return response()->json([
					'status' => 'error',
					'message' => 'Terjadi kesalahan saat generate AI.',
					'error' => $e->getMessage()
				], 500);
			}
		}




		


}