<?php namespace App\Http\Controllers;

use App\Models\Sendwa;
use App\Library\DataHelpers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Pagination\LengthAwarePaginator as Paginator;
use Validator, Input, Redirect ; 

class SendwaController extends Controller {

	protected $layout = "layouts.main";
	protected $data = array();	
	public $module = 'sendwa';
	static $per_page	= '10';
	
	public function __construct() 
	{
		parent::__construct();
		$this->model = new Sendwa();
		
		$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'		=> 'sendwa',
			'pageUrl'			=>  url('sendwa'),
			'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('sendwa.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 'formEarlyWarningMorfologi':
				return $this->formEarlyWarningMorfologi($request);
				break;
			case 'formEarlyWarningLKP':
				return $this->formEarlyWarningLKP($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 );
					$id = $this->model->insertRow($data , $request->input( $this->info['key']));

					if ($data['tujuan'] != null) {

								$tujuanList = explode(',', $data['tujuan']);
								foreach ($tujuanList as $tujuan) {
									$tujuan = trim($tujuan); // Remove any extra spaces
									$tujuanData = \DB::table('master_nohp')->where('nohp', $tujuan)->first();
									if ($tujuanData) {
										if($data['kategori'] == 'dokumen'){
											$this->broadcastMessageDok($data['pesan'], $tujuanData->nohp, $tujuanData->nama, asset("uploads/file_notif_wa/" . $data['url']));
										}else if($data['kategori'] == 'gambar'){
											$this->broadcastMessageImg($data['pesan'], $tujuanData->nohp, $tujuanData->nama, asset("uploads/file_notif_wa/" . $data['url']));
											
										}else if($data['kategori'] == 'pesan'){
											$this->broadcastMessage($data['pesan'], $tujuanData->nohp, $tujuanData->nama);
										}else{

										}
									}
								}
						
					}
					/* 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 'getEarlyWarningMorfologiUnitMessage':
				return $this->getEarlyWarningMorfologiUnitMessage($request);
				break;	
			case 'getEarlyWarningLKPUnitMessage':
				return $this->getEarlyWarningLKPUnitMessage($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);
		}

		$conf['order']['sort'] = "id";
		$conf['order']['by'] ="DESC";
		$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'] == 'tujuan') {
						$tujuanList = explode(',', $row->{$field['field']});
						$tujuanData = \DB::table('master_nohp')->whereIn('nohp', $tujuanList)->get();
						$values[$field['field']] = $tujuanData->map(function($item) {
							return '<span class="badge badge-primary">' . $item->nama . '</span>';
						})->implode(' ');
					
					} 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)
		{
			$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 broadcastMessage($message, $nohp, $nama)
	{
			$this->sendMessage($message, $nohp);
			sleep(5); // Delay for 5 seconds between each message

		return response()->json(['message' => 'Send to '.$nama.' successfully'], 200);
	}

	public function broadcastMessageDok($message, $nohp, $nama, $url)
	{
			$this->sendDocument($nohp, $url, $message);
			sleep(5); // Delay for 5 seconds between each message

		return response()->json(['message' => 'Send to '.$nama.' successfully'], 200);
	}

	public function broadcastMessageImg($message, $nohp, $nama, $url)
	{
			$response = $this->sendImage($nohp, $url, $message);
			sleep(5); // Delay for 5 seconds between each message

		return response()->json(['message' => 'Send to '.$nama.' successfully'], 200);
	}

	public function sendMessage($pesan, $nohp)
	{
		$payload = array(
			'chatId' => $nohp . '@c.us',
			'text' => $pesan,
			'session' => 'default'
		);

		$url = env('WAHA_URL') . '/api/sendText';

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			'Content-Type: application/json',
			'Accept: application/json',
			'X-Api-Key: ' . env('API_KEY_WAHA')
		]);

		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		curl_close($ch);

		if ($httpCode >= 200 && $httpCode < 300) {
			return response()->json(['message' => 'Message sent successfully'], 200);
		}

		return response()->json(['error' => 'Failed to send message'], $httpCode);
	}

	public function sendImage($nohp, $imageUrl, $caption)
	{
		$payload = array(
			'session' => 'default',
			'chatId' => $nohp,
			'file' => array(
				'mimetype' => 'image/jpeg',
				'url' => $imageUrl,
				'filename' => 'filename.jpeg'
			),
			'caption' => $caption
		);

		$url = env('WAHA_URL') . '/api/sendImage';

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			'X-Api-Key: ' . env('API_KEY_WAHA'),
			'Accept: application/json',
			'Content-Type: application/json'
		]);

		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		curl_close($ch);

		if ($httpCode >= 200 && $httpCode < 300) {
			return response()->json(['message' => 'Image sent successfully'], 200);
		}

		return response()->json(['error' => 'Failed to send image'], $response);
	}

	public function sendDocument($nohp, $documentUrl, $caption)
	{
		$payload = array(
			'session' => 'default',
			'chatId' => $nohp,
			'file' => array(
				'mimetype' => 'application/pdf',
				'url' => $documentUrl,
				'filename' => 'document.pdf'
			),
			'caption' => $caption
		);

		$url = env('WAHA_URL') . '/api/sendFile';

		$ch = curl_init();

		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, [
			'X-Api-Key: ' . env('API_KEY_WAHA'),
			'Accept: application/json',
			'Content-Type: application/json'
		]);

		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

		curl_close($ch);

		if ($httpCode >= 200 && $httpCode < 300) {
			return response()->json(['message' => 'Document sent successfully'], 200);
		}

		return response()->json(['error' => 'Failed to send document'], $httpCode);
}


public function formEarlyWarningMorfologi(Request $request)
	{		
		$html = "";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='tahun' class='col-sm-3 col-form-label'>Tahun</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<input type='text' class='form-control' id='tahun' name='tahun' placeholder='Tahun'>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='tanggal' class='col-sm-3 col-form-label'>Tanggal</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<input type='date' class='form-control' id='tanggal' name='tanggal'>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='kebun' class='col-sm-3 col-form-label'>Kebun</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<select class='form-control' id='kebun' name='kebun'></select>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<div class='col-sm-12 text-center'>";
		$html .= "<button type='button' class='btn btn-xs btn-primary' id='sendEarlyWarningMorfologi'>Generate Message</button>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='generatedMessage' class='col-sm-3 col-form-label'>Generated Message</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<div style='display: flex; gap: 5px;'>";
		$html .= "<textarea class='form-control' id='generatedMessage' name='generatedMessage' rows='6' style='flex: 1;'></textarea>";
		$html .= "<button type='button' class='btn btn-xs btn-secondary' id='copyMessageBtn' style='height: fit-content; white-space: nowrap;'>Copy Text</button>";
		$html .= "<button type='button' class='btn btn-xs btn-success' id='setPesanBtn' style='height: fit-content; white-space: nowrap;'>Set Pesan</button>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "</div>";
		
		$html .= "<script>";		
		$html .= "$(document).ready(function() {";				
		$html .= "$('#kebun').jCombo('dataprodisconsole/comboselect?filter=master_kebun:kode_kebun:nama_kebun',{  initial_text : 'Pilih Kebun'});";
		$html .= "  function autoResizeTextarea(textarea) {";
		$html .= "    textarea.style.height = 'auto';";
		$html .= "    textarea.style.height = Math.min(textarea.scrollHeight, 400) + 'px';";
		$html .= "  }";
		$html .= "$('#setPesanBtn').click(function() {";
		$html .= "var generatedMessage = $('#generatedMessage').val();";
		$html .= "if (generatedMessage) {";
		$html .= "$('#pesan').val(generatedMessage);";
		$html .= "notyMessage('Pesan berhasil diset.');";
		$html .= "}";
		$html .= "});";

		$html .= "  $('#sendEarlyWarningMorfologi').click(function() {";
		$html .= "    var tahun = $('#tahun').val();";
		$html .= "    var tanggal = $('#tanggal').val();";
		$html .= "    var kebun = $('#kebun').val();";
		$html .= "    if (tahun && tanggal && kebun) {";
		$html .= "      $.ajax({";
		$html .= "        url: 'sendwa?action_task=getEarlyWarningMorfologiUnitMessage',";
		$html .= "        method: 'POST',";
		$html .= "        data: {tahun: tahun, tanggal: tanggal, kebun: kebun},";
		$html .= "        success: function(response) {";
		$html .= "          $('#generatedMessage').val(response.message);";
		$html .= "          autoResizeTextarea(document.getElementById('generatedMessage'));";
		$html .= "        },";
		$html .= "        error: function(xhr) {";
		$html .= "          alert('Error: ' + xhr.responseJSON.error);";
		$html .= "        }";
		$html .= "      });";
		$html .= "    } else {";
		$html .= "      alert('Please fill all fields');";
		$html .= "    }";
		$html .= "  });";
		$html .= "});";
		$html .= "</script>";
		
		return $html;
	}

	public function formEarlyWarningLKP(Request $request)
	{		
		$html = "";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='tgl_awal' class='col-sm-3 col-form-label'>Tanggal Awal</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<input type='date' class='form-control' id='tgl_awal' name='tgl_awal'>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='tgl_akhir' class='col-sm-3 col-form-label'>Tanggal Akhir</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<input type='date' class='form-control' id='tgl_akhir' name='tgl_akhir'>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='kebun' class='col-sm-3 col-form-label'>Kebun</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<select class='form-control' id='kebun' name='kebun'></select>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<div class='col-sm-12 text-center'>";
		$html .= "<button type='button' class='btn btn-xs btn-primary' id='sendEarlyWarningLKP'>Generate Message</button>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<div class='form-group row'>";
		$html .= "<label for='generatedMessage' class='col-sm-3 col-form-label'>Generated Message</label>";
		$html .= "<div class='col-sm-9'>";
		$html .= "<div style='display: flex; gap: 5px;'>";
		$html .= "<textarea class='form-control' id='generatedMessage' name='generatedMessage' rows='6' style='flex: 1;'></textarea>";
		$html .= "<button type='button' class='btn btn-xs btn-secondary' id='copyMessageBtn' style='height: fit-content; white-space: nowrap;'>Copy Text</button>";
		$html .= "<button type='button' class='btn btn-xs btn-success' id='setPesanBtn' style='height: fit-content; white-space: nowrap;'>Set Pesan</button>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "</div>";
		$html .= "<script>";
		$html .= "$(document).ready(function() {";
		$html .= "$('#kebun').jCombo('dataprodisconsole/comboselect?filter=master_kebun:kode_kebun:nama_kebun',{  initial_text : 'Pilih Kebun'});";
		$html .= "  function autoResizeTextarea(textarea) {";
		$html .= "    textarea.style.height = 'auto';";
		$html .= "    textarea.style.height = Math.min(textarea.scrollHeight, 400) + 'px';";
		$html .= "  }";
		$html .= "$('#setPesanBtn').click(function() {";
		$html .= "var generatedMessage = $('#generatedMessage').val();";
		$html .= "if (generatedMessage) {";
		$html .= "$('#pesan').val(generatedMessage);";
		$html .= "notyMessage('Pesan berhasil diset.');";
		$html .= "}";
		$html .= "});";

		$html .= "$('#sendEarlyWarningLKP').click(function() {";
		$html .= "var tgl_awal = $('#tgl_awal').val();";
		$html .= "var tgl_akhir = $('#tgl_akhir').val();";
		$html .= "var kebun = $('#kebun').val();";
		$html .= "if (tgl_awal && tgl_akhir && kebun) {";
		$html .= "$.ajax({";
		$html .= "url: 'sendwa?action_task=getEarlyWarningLKPUnitMessage',";
		$html .= "method: 'POST',";
		$html .= "data: {tgl_awal: tgl_awal, tgl_akhir: tgl_akhir, kebun: kebun},";
		$html .= "success: function(response) {";
		$html .= "$('#generatedMessage').val(response.message);";
		$html .= "autoResizeTextarea(document.getElementById('generatedMessage'));";
		$html .= "},";
		$html .= "error: function(xhr) {";
		$html .= "alert('Error: ' + xhr.responseJSON.error);";
		$html .= "}";
		$html .= "});";
		$html .= "} else {";
		$html .= "alert('Please fill all fields');";
		$html .= "}";
		$html .= "});";
		$html .= "});";
		$html .= "</script>";

		return $html;
	}




public function getEarlyWarningMorfologiUnitMessage(Request $request)
	{		
		$tahun = $request->input('tahun');
		$tanggal = $request->input('tanggal');
		$kebun = $request->input('kebun');


		$periode = $this->getPeriodeFromDate($tanggal);

		$gmData = DB::table('master_kebun as a')
			->join('master_nohp as b', 'a.nik_gm', '=', 'b.nik')
			->where('a.kode_kebun', $kebun)
			->select('a.nama_gm', 'b.nik', 'b.nohp')
			->first();

		$nama_gm = $gmData->nama_gm ?? 'Bapak GM';
		$nik_gm = $gmData->nik ?? null;
		$nohp_gm = $gmData->nohp ?? null;

		$data = DB::select(
			'call sp_rekap_morfologi_rayon_periode_dinamis(?, ?, ?, ?)',
			[$tahun, $periode, $kebun, 0]
		);

		$message = $this->buildEarlyWarningMorfologiUnitMessage($data, $tahun, $periode, $kebun, $nama_gm);
		return response()->json(['message' => $message]);
	}

	public function getEarlyWarningLKPUnitMessage(Request $request)
	{

		$tglAwal = $request->input('tgl_awal');
		$tglAkhir = $request->input('tgl_akhir');
		$kebun = $request->input('kebun');

		$gmData = DB::table('master_kebun as a')
			->join('master_nohp as b', 'a.nik_gm', '=', 'b.nik')
			->where('a.kode_kebun', $kebun)
			->select('a.nama_gm', 'b.nohp')
			->first();

		$nama_gm = $gmData->nama_gm ?? 'Bapak/Ibu GM';
		$nohp_gm = $gmData->nohp ?? null;
		// $nohp_gm = "6285647384318";

		$data = DB::select(
			'call sp_lkp_rekap_pcrc_notif_wa(?, ?, ?, ?)',
			[$tglAwal, $tglAkhir, $kebun, null]
		);

		$message = $this->buildEarlyWarningLKPUnitMessage($data, $tglAwal, $tglAkhir, $kebun, $nama_gm);
		return response()->json(['message' => $message]);
	}

public function buildEarlyWarningMorfologiUnitMessage($data, $tahun, $periode, $kebun = 'NULL', $nama_gm = 'Bapak GM')
	{
		$rows = collect($data);

		$periodeKey = strtoupper(trim($periode));
		$sasaranField = 'jumlah_petak_tanamkepras_sd_' . $periodeKey;
		$realisasiField = 'morfologi_' . $periodeKey;

		if ($rows->isEmpty()) {
			return "📊 *EARLY WARNING LAPORAN INPUT DATA*\n\nYth. {$nama_gm},\n\nData tidak tersedia untuk periode {$periodeKey} tahun {$tahun}.";
		}

		// Fallback jika field periode dinamis tidak ada di hasil SP
		$firstRow = (array) $rows->first();
		if (!array_key_exists($sasaranField, $firstRow)) {
			$sasaranField = 'jumlah_petak_tanamkepras_sd_3A';
		}
		if (!array_key_exists($realisasiField, $firstRow)) {
			$realisasiField = 'morfologi_3A';
		}

		$totalSasaran = 0;
		$totalRealisasi = 0;
		$belowTargetRayons = [];

		$message = "📊 *EARLY WARNING LAPORAN INPUT DATA MORFOLOGI (MINGGUAN)*";
		$message .= "\n\nYth. Bapak/Ibu GM \n{$nama_gm},";
		$message .= "\n\nBerikut kami sampaikan progres pelaporan MORFOLOGI s.d. {$periodeKey}:";
		$message .= "\n";

		foreach ($rows as $row) {
			$namaRayon = $row->nama_rayon ?? '-';
			$luasPolig = (float) ($row->luas_polig ?? 0);
			$sasaran = (float) ($row->{$sasaranField} ?? 0);
			$realisasi = (float) ($row->{$realisasiField} ?? 0);
			$persen = $sasaran > 0 ? round(($realisasi / $sasaran) * 100, 2) : 0;

			$totalSasaran += $sasaran;
			$totalRealisasi += $realisasi;

			// Track rayons below 100%
			if ($persen < 100 && $persen > 0) {
				$belowTargetRayons[] = [
					'name' => $namaRayon,
					'persen' => $persen,
					'realisasi' => $realisasi,
					'sasaran' => $sasaran
				];
			}

			$message .= "\n*{$namaRayon}*";
			$message .= "\nLuas: " . $this->formatEarlyWarningNumber($luasPolig, 3);
			$message .= "\nSasaran: " . $this->formatEarlyWarningNumber($sasaran) . " petak";
			$message .= "\nRealisasi: " . $this->formatEarlyWarningNumber($realisasi) . " petak";
			$message .= "\nCapaian: " . $this->formatEarlyWarningNumber($persen, 2) . "%";
			$message .= "\n";
		}

		$totalPersen = $totalSasaran > 0 ? round(($totalRealisasi / $totalSasaran) * 100, 2) : 0;

		// Add notes section
		$message .= "\n📌 *CATATAN:*";

		if (count($belowTargetRayons) === 0 && $totalPersen >= 100) {
			$message .= "\nSecara umum progres sudah mencapai target. Terima kasih atas dedikasi tim.";
		} else {
			if ($totalPersen < 100) {
				$message .= "\nSecara umum progres masih di bawah target. ";
			} else {
				$message .= "\nSecara umum progres sudah berjalan baik, namun masih terdapat kekurangan input pada wilayah tertentu. ";
			}
			
			if (count($belowTargetRayons) > 0) {
				$message .= "Mohon perhatian untuk percepatan ";
				$message .= "Agar target mingguan dapat tercapai.";
			}
		}
		
		$message .= "\n\n💡 *CATATAN PENTING:*";
		$message .= "\nData ini akan digunakan untuk penyusunan Dashboard PICA yang akan disosialisasikan ke masing-masing GM Kebun.";

		$message .= "\n\nDemikian kami sampaikan sebagai early warning monitoring periode mingguan.";
		$message .= "\n\nTerima kasih.";
		$message .= "\n\n@cc Kabag Operasional";

		return $message;
	}

	public function buildEarlyWarningLKPUnitMessage($data, $startDate, $endDate, $kebun = 'SK09', $nama_gm = 'Bapak GM')
	{
		$rows = collect($data);

		if ($rows->isEmpty()) {
			return "EARLY WARNING LAPORAN INPUT LKP (MINGGUAN)\n\nYth. Bapak GM Kebun {$kebun}\n{$nama_gm} ,\n\nData tidak tersedia untuk periode {$startDate} s.d. {$endDate}.";
		}

		$totalSource = $rows->first(function ($row) {
			$rayon = trim((string) ($row->rayon ?? ''));
			return stripos($rayon, 'total') === 0;
		});

		$kebunLabel = $kebun;
		if ($totalSource && !empty($totalSource->rayon)) {
			$kebunLabel = trim(preg_replace('/^total\s*/i', '', (string) $totalSource->rayon));
		}

		$detailRows = $rows->filter(function ($row) {
			$rayon = trim((string) ($row->rayon ?? ''));
			return stripos($rayon, 'total') === false;
		});

		$totalRow = (object) [
			'ha_serah_tanah' => $detailRows->sum('ha_serah_tanah'),
			'ha_tanam_kepras_total' => $detailRows->sum('ha_tanam_kepras_total'),
			'ha_pupuk_1_total' => $detailRows->sum('ha_pupuk_1_total'),
			'ha_pupuk_2_total' => $detailRows->sum('ha_pupuk_2_total'),
			'ha_bumbun_1' => $detailRows->sum('ha_bumbun_1'),
			'ha_bumbun_2' => $detailRows->sum('ha_bumbun_2'),
			'ha_bumbun_3' => $detailRows->sum('ha_bumbun_3'),
			'ha_klentek_1' => $detailRows->sum('ha_klentek_1'),
			'ha_klentek_2' => $detailRows->sum('ha_klentek_2'),
			'ha_klentek_3' => $detailRows->sum('ha_klentek_3'),
		];

		$formattedEndDate = date('d-m-Y', strtotime($endDate));
		$mtYear = date('Y', strtotime($endDate));
		$nextMtYear = (int) $mtYear + 1;

		$message = "EARLY WARNING LAPORAN INPUT LKP (MINGGUAN)";
		$message .= "\n\nYth. Bapak GM Kebun {$kebunLabel}";
		$message .= "\n{$nama_gm} ,";
		$message .= "\n\nBerikut kami sampaikan progres pelaporan LKP TG MT {$mtYear}/{$nextMtYear} untuk Kebun {$kebunLabel} s.d. {$formattedEndDate} :";

		$message .= "\n\nTotal Kebun {$kebunLabel}";
		$message .= "\nSerah Tanah: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_serah_tanah ?? 0), 3) . " Ha";
		$message .= "\nTanam/Kepras: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_tanam_kepras_total ?? 0), 3) . " Ha";
		$message .= "\nPupuk 1: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_pupuk_1_total ?? 0), 3) . " Ha";
		$message .= "\nPupuk 2: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_pupuk_2_total ?? 0), 3) . " Ha";
		$message .= "\nBumbun 1: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_bumbun_1 ?? 0), 3) . " Ha";
		$message .= "\nBumbun 2: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_bumbun_2 ?? 0), 3) . " Ha";
		$message .= "\nBumbun 3: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_bumbun_3 ?? 0), 3) . " Ha";
		$message .= "\nKlentek 1: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_klentek_1 ?? 0), 3) . " Ha";
		$message .= "\nKlentek 2: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_klentek_2 ?? 0), 3) . " Ha";
		$message .= "\nKlentek 3: " . $this->formatEarlyWarningNumber((float) ($totalRow->ha_klentek_3 ?? 0), 3) . " Ha";

		foreach ($detailRows as $row) {
			$rayon = $row->rayon ?? '-';
			$rayonLabel = trim((string) $rayon);
			if (stripos($rayonLabel, 'rayon') !== 0) {
				$rayonLabel = 'Rayon ' . $rayonLabel;
			}

			$message .= "\n\n{$rayonLabel}";
			$message .= "\nSerah Tanah: " . $this->formatEarlyWarningNumber((float) ($row->ha_serah_tanah ?? 0), 3) . " Ha";
			$message .= "\nTanam/Kepras: " . $this->formatEarlyWarningNumber((float) ($row->ha_tanam_kepras_total ?? 0), 3) . " Ha";
			$message .= "\nPupuk 1: " . $this->formatEarlyWarningNumber((float) ($row->ha_pupuk_1_total ?? 0), 3) . " Ha";
			$message .= "\nPupuk 2: " . $this->formatEarlyWarningNumber((float) ($row->ha_pupuk_2_total ?? 0), 3) . " Ha";
			$message .= "\nBumbun 1: " . $this->formatEarlyWarningNumber((float) ($row->ha_bumbun_1 ?? 0), 3) . " Ha";
			$message .= "\nBumbun 2: " . $this->formatEarlyWarningNumber((float) ($row->ha_bumbun_2 ?? 0), 3) . " Ha";
			$message .= "\nBumbun 3: " . $this->formatEarlyWarningNumber((float) ($row->ha_bumbun_3 ?? 0), 3) . " Ha";
			$message .= "\nKlentek 1: " . $this->formatEarlyWarningNumber((float) ($row->ha_klentek_1 ?? 0), 3) . " Ha";
			$message .= "\nKlentek 2: " . $this->formatEarlyWarningNumber((float) ($row->ha_klentek_2 ?? 0), 3) . " Ha";
			$message .= "\nKlentek 3: " . $this->formatEarlyWarningNumber((float) ($row->ha_klentek_3 ?? 0), 3) . " Ha";
		}

		$message .= "\n\n📌 CATATAN:";
		$message .= "\n- Agar selalu melakukan pelaporan LKP harian melalui Aplikasi Digifarm Grow atau Prodis KSO";
		$message .= "\n\n💡 CATATAN PENTING:";
		$message .= "\nData ini akan digunakan untuk rapat weekly bersama BOD dan dasar persetujuan dropping biaya mingguan";
		$message .= "\n\nDemikian kami sampaikan sebagai early warning monitoring periode mingguan.";
		$message .= "\n\nTerima kasih.";
		$message .= "\n\nPesan ini dikirim otomatis dari Prodis KSO";

		return $message;
	}

	protected function formatEarlyWarningNumber($value, $decimals = 0)
	{
		return number_format((float) $value, $decimals, ',', '.');
	}
	protected function getPeriodeFromDate($date)
	{
		$day = (int) date('d', strtotime($date));
		$month = (int) date('m', strtotime($date));
		if ($day >= 1 && $day <= 15) {
			return $month . 'A';
		} else {
			return $month . 'B';
		}
	}
}
