<?php
namespace App\Controllers;

class PrintLabelSby extends BaseController {

	public function splitName($fullName) {
		$words = explode(' ', $fullName); // Pisahkan nama berdasarkan spasi
        $line1 = '';
        $line2 = '';

        // Tambahkan kata-kata ke baris pertama hingga mencapai batas 20 karakter
        foreach ($words as $word) {
            if (strlen($line1 . ' ' . $word) <= 27) {
                $line1 .= (empty($line1) ? '' : ' ') . $word;
            } else {
                // Setelah line1 penuh, pindahkan kata ke line2
                if (strlen($line2 . ' ' . $word) <= 19) {
                    $line2 .= (empty($line2) ? '' : ' ') . $word;
                }
            }
        }

        // Jika Line 2 lebih dari 19 karakter, hapus kata terakhir sampai sesuai
        while (strlen($line2) > 19) {
            $wordsLine2 = explode(' ', $line2);
            array_pop($wordsLine2); // Hapus kata terakhir
            $line2 = implode(' ', $wordsLine2); // Gabungkan kembali
        }

        // Kembalikan kedua baris sebagai array
        return ['line1' => $line1, 'line2' => $line2];
	}

	public function labelZebraCollection($access) {

		$time = microtime(true);
		$logTime = date('d-m-Y_H_i_s', $time) . sprintf('_%03d', ($time - floor($time)) * 1000);
		$filename = "collection(".$access.")_".$logTime;
		
		$role = session()->get('userrole');
		$networkPath = "";

		$db = \Config\Database::connect();
		$sql = "select p.PATNUMBER as UHID, sr.HOSTORDERNUMBER as BV, concat (p.FIRSTNAMESK, ' ', p.NAME) as NAME, p.SEX,
				DATEDIFF(YEAR, BirthDate, GETDATE()) - 
					CASE WHEN MONTH(BirthDate) > MONTH(GETDATE()) OR (MONTH(BirthDate) = MONTH(GETDATE()) AND DAY(BirthDate) > DAY(GETDATE())) THEN 1 
					ELSE 0 END AS AGE, sr.COLLECTIONDATE, p.BIRTHDATE
				from SP_REQUESTS sr
				left join SP_REQUESTS st on sr.SP_ACCESSNUMBER=st.SP_ACCESSNUMBER
				left join PATIENTS p on p.PATID=sr.PATID
				where st.SP_ACCESSNUMBER='$access'";
		$query = $db->query($sql);
		$results = $query->getResultArray();
		$item = $results[0];

		$uhid = substr($item['UHID'], -10);
		$bv = $item['BV'];
		$sex = $item['SEX'] == 1 ? "M" : "F";
		$title = $item['SEX'] == 1 ? "Mr" : "Mrs";
		$name = $item['NAME'];
		$age = $item['AGE'];
		$birthdate = $item['BIRTHDATE'];
		$date = \DateTime::createFromFormat('Y-m-d H:i:s.v', $birthdate);
		if ($date) {
			$birthdate = $date->format('d/m/Y');
		} else {
			$birthdate = "";
		}

		$collectiondate = $item['COLLECTIONDATE'];
		$date = \DateTime::createFromFormat('Y-m-d H:i:s.v', $collectiondate);
		if ($date) {
			$collectiondate = $date->format('d/m/Y H:i');
		} else {
			$collectiondate = "";
		}

		$fixName = $this->splitName($name);
		$name1 = $fixName['line1'];
		$name2 = $fixName['line2'];

		if ($sex == 'M') {
			$jarak = '42';
		} else {
			$jarak = '53';
		}

		$label = "^XA
^LH0,0
^LL400
^PW400
^FO4,10^ADN,18,10^FD$title.$name1^FS
^FO$jarak,27^ADN,18,10^FD$name2^FS
^FO325,42^ADN,18,10^FD$sex {$age}Y^FS
^FO4,47^ADN,18,10^FDDoB: $birthdate^FS
^FO50,67^BY2,2,70^BCN,70,N,N^FD$access^FS
^FO110,142^ADN,18,10^FDREQ# $access^FS
^FO4,181^ADN,18,10^FDRM:$uhid^FS
^FO4,164^ADN,18,10^FDVN:$bv^FS
^FO195,181^ADN,18,10^FD$collectiondate^FS
^XZ
";

		$printer = $this->printerLab();
		
		// $folder = "C:/data/";
		$folder = $printer[0];
		$fullPath = $folder . $filename;
		
		// Tulis file ke folder tujuan
		if (!file_put_contents($fullPath, $label)) {
			
			//exec('net use '. $letterPath .' /delete 2>&1', $output, $return_var);	
			// Eksekusi Kode Berikut Apabila Ada Error
			return $this->response->setJSON([
				'error'   => $output,
				'message' => "Gagal Melakukan Print, Mohon Ulangi Atau Cek Koneksi Printer Anda",
				'status'  => false,
			]);

		} else {

			// Hapus Koneksi
			//exec('net use '. $letterPath .' /delete 2>&1', $output, $return_var);
			return $this->response->setJSON( [
				'message' => "Print Berhasil!" ,
				'status'   => true,
			]);
		}

	}

	public function labelZebra($sample, $title, $name, $sex, $age, $barcode, $uhid, $bv, $collection_date, $birthdate) {
		$fixName = $this->splitName($name);
		$name1 = $fixName['line1'];
		$name2 = $fixName['line2'];

		if ($sex == 'M') {
			$jarak = '42';
		} else {
			$jarak = '53';
		}

		$sampleLabel = "^XA
^LH0,0
^LL400
^PW400
^FO4,20^ADN,18,10^FD$title.$name1^FS
^FO$jarak,37^ADN,18,10^FD$name2^FS
^FO325,42^ADN,18,10^FD$sex {$age}Y^FS
^FO4,54^ADN,18,10^FD$sample^FS
^FO205,64^ADN,18,10^FDDoB: $birthdate^FS
^FO65,85^BY2,3,70^BCN,70,N,N^FD$barcode^FS
^FO115,160^ADN,18,10^FDSAM# $barcode^FS
^FO4,182^ADN,18,10^FDRM:$uhid^FS
^FO195,182^ADN,18,10^FD$collection_date^FS
^XZ
";
		return $sampleLabel;
	}

	
	public function printerLab() {		
		exec('net use Y: \\\\10.0.10.30\\Labelshare /user:Administrator 2>&1', $output, $return_var);
		$pathNetworkFolder = 'Y:/Sampling_Labels/';
		$letterPath = 'Y:';
		return array($pathNetworkFolder, $letterPath);
	}

	public function printSingle($access, $sampletype) {

		$time = microtime(true);
		$logTime = date('d-m-Y_H_i_s', $time) . sprintf('_%03d', ($time - floor($time)) * 1000);
		$filename = "sample(".$sampletype.")_".$logTime;
		
		$role = session()->get('userrole');
		$networkPath = "";

		$db = \Config\Database::connect();
		$sql = "select p.PATNUMBER as UHID, sr.HOSTORDERNUMBER as BV, concat (p.FIRSTNAMESK, ' ',p.NAME) as NAME, p.SEX,
				DATEDIFF(YEAR, BirthDate, GETDATE()) - 
					CASE WHEN MONTH(BirthDate) > MONTH(GETDATE()) OR (MONTH(BirthDate) = MONTH(GETDATE()) AND DAY(BirthDate) > DAY(GETDATE())) THEN 1 
					ELSE 0 END AS AGE, 
				ds.SHORTTEXT AS FULLTEXT, st.SAMPLETYPE+right(sr.SP_ACCESSNUMBER,5) as BARCODE, sr.COLLECTIONDATE, p.BIRTHDATE
				from SP_TUBES st
				left join SP_REQUESTS sr on st.SP_ACCESSNUMBER=sr.SP_ACCESSNUMBER
				left join PATIENTS p on p.PATID=sr.PATID
				left join DICT_SAMPLES_TYPES ds on ds.SAMPCODE=st.SAMPLETYPE
				where st.SP_ACCESSNUMBER='$access' AND ds.SAMPCODE = '$sampletype'";

		$query = $db->query($sql);
		$results = $query->getResultArray();
		$item = $results[0];

		$uhid = substr($item['UHID'], -10);
		$bv = $item['BV'];
		$sex = $item['SEX'] == 1 ? "M" : "F";
		$title = $item['SEX'] == 1 ? "Mr" : "Mrs";
		$name = $item['NAME'];

		if ($sampletype == '200'){
			$sample = 'SERUM KIMIA';
		} else if ($sampletype == '250'){
			$sample = 'SERUM IMUN';
		} else {
			$sample = $item['FULLTEXT'];
		}
		
		$barcode = $item['BARCODE'];
		$age = $item['AGE'];
		$birthdate = $item['BIRTHDATE'];
		$date = \DateTime::createFromFormat('Y-m-d H:i:s.v', $birthdate);
		if ($date) {
			$birthdate = $date->format('d/m/Y');
		} else {
			$birthdate = "";
		}
		$collectiondate = $item['COLLECTIONDATE'];
		$date = \DateTime::createFromFormat('Y-m-d H:i:s.v', $collectiondate);
		if ($date) {
            $collectiondate = $date->format('d/m/Y H:i');
        } else {
            $collectiondate = "";
        }

		$printer = $this->printerLab();
		$label = $this->labelZebra($sample, $title, $name, $sex, $age, $barcode, $uhid, $bv, $collectiondate, $birthdate);

		// $folder = "C:/data/";
		$folder = $printer[0];
		$fullPath = $folder . $filename;
		
		// Tulis file ke folder tujuan
		if (!file_put_contents($fullPath, $label)) {
			
			//exec('net use '. $letterPath .' /delete 2>&1', $output, $return_var);	
			// Eksekusi Kode Berikut Apabila Ada Error
			return $this->response->setJSON([
				'error'   => $output,
				'message' => "Gagal Melakukan Print, Mohon Ulangi Atau Cek Koneksi Printer Anda",
				'status'  => false,
			]);

		} else {

			// Hapus Koneksi
			//exec('net use '. $letterPath .' /delete 2>&1', $output, $return_var);
			return $this->response->setJSON( [
				'message' => "Print Berhasil!" ,
				'status'   => true,
			]);
		}
	}
	
	public function printAll($access) {
		$db = \Config\Database::connect();
		$sql = "select SAMPLETYPE from SP_TUBES where SP_ACCESSNUMBER='$access'";
		$query = $db->query($sql);
		$results = $query->getResultArray();
		foreach($results as $data) {
			$sample = $data['SAMPLETYPE'];
			$this->printSingle($access, $sample);
		}
		$this->labelZebraCollection($access);	
	}
}