<?php
if (!function_exists('view')) {
    function view(string $viewPath, array $data = [], Bool $render=false) {
        $file = realpath(__DIR__ . '/../Views') . '/' . str_replace('.', '/', $viewPath) . '.php';
        
        if (!file_exists($file)) {
            throw new Exception("View file not found: $file");
        }
		extract($data);
		if(!$render) {
			ob_start();
			include $file;
			return ob_get_clean();
		} else {
			include $file;
		}
    }
}

if(!function_exists('base_url')) {
    function base_url($path = '') {
		$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? "https://" : "http://";
        $host = $_SERVER['HTTP_HOST'];
        $script_dir = str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
        $url = rtrim($protocol . $host . $script_dir, '/');
		
		return $url . '/' . (!empty($path)?ltrim($path, '/'):'');
    }
}

if(!function_exists('getInWordAmnt')) {
    // function getInWordAmnt($number)
	// {
	// 	$decimal = round($number - ($no = floor($number)), 2) * 100;
	// 	$hundred = null;
	// 	$digits_length = strlen($no);
	// 	$i = 0;
	// 	$str = array();
	// 	$words = array(0 => '', 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 10 => 'ten', 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen', 14 => 'fourteen', 15 => 'fifteen', 16 => 'sixteen', 17 => 'seventeen', 18 => 'eighteen', 19 => 'nineteen', 20 => 'twenty', 30 => 'thirty', 40 => 'forty', 50 => 'fifty', 60 => 'sixty', 70 => 'seventy', 80 => 'eighty', 90 => 'ninety');
	// 	$digits = array('', 'hundred', 'thousand', 'lakh', 'crore');
	// 	while ($i < $digits_length) {
	// 		$divider = ($i == 2) ? 10 : 100;
	// 		$number = floor($no % $divider);
	// 		$no = floor($no / $divider);
	// 		$i += $divider == 10 ? 1 : 2;
	// 		if ($number) {
	// 			$plural = (($counter = count($str)) && $number > 9) ? 's' : null;
	// 			$hundred = ($counter == 1 && $str[0]) ? '  ' : null;
	// 			$str[] = ($number < 21) ? $words[$number] . ' ' . $digits[$counter] . $plural . ' ' . $hundred : $words[floor($number / 10) * 10] . ' ' . $words[$number % 10] . ' ' . $digits[$counter] . $plural . ' ' . $hundred;
	// 		} else
	// 			$str[] = null;
	// 	}
	// 	$Rupees = implode('', array_reverse($str));
	// 	$paise = ($decimal) ? "." . ($words[$decimal / 10] . " " . $words[$decimal % 10]) . ' Paise' : '';
	// 	return strtoupper(($Rupees ? $Rupees . 'Rupees ' : '') . $paise);
	// }

	function getInWordAmnt($number)
	{
		$no = floor($number);
		$decimal = (int) round(($number - $no) * 100);   // FIXED

		$hundred = null;
		$digits_length = strlen($no);
		$i = 0;
		$str = array();

		$words = array(
			0 => '', 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four',
			5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine',
			10 => 'ten', 11 => 'eleven', 12 => 'twelve', 13 => 'thirteen',
			14 => 'fourteen', 15 => 'fifteen', 16 => 'sixteen', 17 => 'seventeen',
			18 => 'eighteen', 19 => 'nineteen', 20 => 'twenty', 30 => 'thirty',
			40 => 'forty', 50 => 'fifty', 60 => 'sixty', 70 => 'seventy',
			80 => 'eighty', 90 => 'ninety'
		);

		$digits = array('', 'hundred', 'thousand', 'lakh', 'crore');

		while ($i < $digits_length) {
			$divider = ($i == 2) ? 10 : 100;
			$numberPart = $no % $divider;
			$no = floor($no / $divider);
			$i += ($divider == 10 ? 1 : 2);

			if ($numberPart) {
				$counter = count($str);
				$plural = ($counter && $numberPart > 9) ? 's' : null;
				$hundred = ($counter == 1 && $str[0]) ? '  ' : null;

				$str[] = ($numberPart < 21)
					? $words[$numberPart] . ' ' . $digits[$counter] . $plural . ' ' . $hundred
					: $words[floor($numberPart / 10) * 10] . ' ' . $words[$numberPart % 10] . ' ' . $digits[$counter] . $plural . ' ' . $hundred;
			} else {
				$str[] = null;
			}
		}

		$Rupees = implode('', array_reverse($str));

		$paise = ($decimal)
			? " . " . $words[intval($decimal / 10) * 10] . " " . $words[$decimal % 10] . " Paise"
			: '';

		return strtoupper(($Rupees ? $Rupees . 'Rupees ' : '') . $paise);
	}

}

if(!function_exists('maskPhoneNo')) {
	function maskPhoneNo(string $mobile): string {
		$hasPlus = (strpos(trim($mobile), '+') === 0);
		$digits = preg_replace('/\D+/', '', $mobile);
		$len = strlen($digits);
		if ($len === 0) {
			return $mobile;
		}
		if ($len >= 7) {
			$start = 3;
			$end = 2;
		} elseif ($len >= 4) {
			$start = ($len >= 5) ? 2 : 1;
			$end = 1;
		} else {
			$start = 0;
			$end = 1;
		}
		$startPart = $start > 0 ? substr($digits, 0, $start) : '';
		$endPart   = $end > 0 ? substr($digits, -$end) : '';
		$maskedLen = $len - strlen($startPart) - strlen($endPart);
		$maskedMid = $maskedLen > 0 ? str_repeat('*', $maskedLen) : '';

		$resultDigits = $startPart . $maskedMid . $endPart;
		return $hasPlus ? ('+' . $resultDigits) : $resultDigits;
	}
}

if(!function_exists('maskEmailId')) {
	function maskEmailId(string $email): string {
		$email = trim($email);
		if ($email === '') return $email;
		if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
			return (strlen($email) > 0) ? (substr($email,0,1) . '***') : $email;
		}
		list($local, $domain) = explode('@', $email, 2);
		$parts = explode('.', $local);
		$maskedParts = [];

		foreach ($parts as $seg) {
			$segLen = mb_strlen($seg, 'UTF-8');
			if ($segLen <= 1) {
				$maskedParts[] = $seg;
			} elseif ($segLen === 2) {
				$first = mb_substr($seg, 0, 1, 'UTF-8');
				$maskedParts[] = $first . '*';
			} else {
				$first = mb_substr($seg, 0, 1, 'UTF-8');
				$last  = mb_substr($seg, -1, 1, 'UTF-8');
				$middleCount = $segLen - 2;
				$maskedParts[] = $first . str_repeat('*', $middleCount) . $last;
			}
		}
		$maskedLocal = implode('.', $maskedParts);
		return $maskedLocal . '@' . $domain;
	}
}