<?php
if (!@session_start()) exit('session baslatilamadi');
//session_destroy(); exit('session silindi');
if (!isset($_GET['_wrx'])) exit('yonlendirme hatasi');
define('SINOPSIS', isset($_GET['sn']) ? $_GET['sn'] == 1 : null); //sinopsis yoksa null, ortu=html ise true değilse false
define('TEMA', in_array($_COOKIE['tema'] ?? 0, [1,2]) ? $_COOKIE['tema'] * 1 : 1);
define('RENK', in_array($_COOKIE['renk'] ?? 0, [1,2,3]) ? $_COOKIE['renk'] * 1 : 2);
require __DIR__.'/../ortam/zemin.php';
require DIZIN.'/alan/temel/KontrolMerkezi.php';
$p = array_values(array_filter(explode('/', trim(substr($_GET['_wrx'], str_starts_with($_GET['_wrx'], WEB_DIZIN) ? strlen(WEB_DIZIN) : 0), '/')), 'strlen'));
$g = (object) array('tasarim' => (object) array('goster' => count($p) < 3 || !str_starts_with($p[2], 'scr_'), 'menu' => isset($_SESSION['statu']), 'harita' => '', 'baslik' => ''));
$o = (object) array('uye_no' => $_SESSION['uye_no'] ?? null, 'cari_no' => $_SESSION['cari_no'] ?? null, 'isletme_no' => $_SESSION['isletme_no'] ?? null, 'sirket_no' => $_SESSION['sirket_no'] ?? null, 'rol_sr' => $_SESSION['rol_sr'] ?? null, 'dep' => $_SESSION['dep'] ?? null, 'birim' => $_SESSION['birim'] ?? null, 'puan' => $_SESSION['puan'] ?? null);
if (isset($_SESSION['statu'])) {
	if (!@include(DIZIN.'alan/temel/yetki.php')) throw new Exception('ACL dosyası bulunamadı.', 14);
	define('ACL', acl_olustur_sirayet($_SESSION['statu'], $o->rol_sr, $o->dep, $o->birim, $o->puan, $_SESSION['r'] ?? []));
	define('ALAN', array_flip(explode(',', 'cari,temel,'.$_SESSION['alan'])));
}
if (!defined('CANLI') || CANLI) error_log($_GET['_wrx']);
while (true) {
	try {
		if (isset($g->tasarim->adres) && $p[1] != 'hata') yaz('ikinciye dongu oluştu', $g->tasarim->adres, $p);
		if (!isset($p[0]) || !$p[0]) $p[0] = 'temel'; else $p[0] = preg_replace('/[^\w_]/', '', strtolower($p[0]));
		if (!isset($p[1]) || !$p[1]) $p[1] = 'varsayilan'; else $p[1] = preg_replace('/[^\w_]/', '', strtolower($p[1]));
		if (!isset($p[2]) || !$p[2]) $p[2] = 'varsayilan'; else $p[2] = preg_replace('/[^\w_]/', '', strtolower($p[2]));
		$g->tasarim->adres = $p[0].'/'.$p[1].'/'.$p[2];

		if (str_starts_with($g->tasarim->adres, 'temel/hata') || in_array($g->tasarim->adres, ['cari/giris/varsayilan', 'cari/giris/scr_kullanici_kontrol', 'cari/giris/sonlandir', 'cari/giris/scr_renk_sec', 'cari/giris/scr_tema_sec']))
			;
		elseif (!$o->uye_no && $g->tasarim->adres == 'temel/varsayilan/varsayilan' && $p = array('cari', 'giris', 'varsayilan'))
			$g->tasarim->adres = 'cari/giris/varsayilan';
		elseif (!is_file(DIZIN.'alan/'.$p[0].'/'.ucfirst($p[1]).'Kontrol.php'))
			throw new Exception('Ulasmaya calistiginiz dizin sistemimizde mevcut degil.', 404);
		elseif (defined('ALAN') && !isset(ALAN[$p[0]]))
			throw new Exception('Bu bölüme erişim izniniz yok. ('.$p[0].')', 401);
		elseif (!$o->uye_no)
			throw new Exception('kyok', 401);
		elseif (!in_array(IP_ADRES, $_SESSION['ip_adresler']))
			throw new Exception('Oturum açılan bilgisayar ile şimdiki bilgisayar birbirine uyuşmuyor. Ip bilginiz değişmiş olmalı. Lütfen tekrar giriş yapınız.', 15);
		elseif (isset($_SESSION['atildi']))
			throw new Exception('Yöneticiniz tarafından oturumunuz sonlandırıldı. Şu an işleminiz devam edemiyor. Lütfen tekrar giriş yapınız.', 13);
		elseif (isset($_SESSION['baska_bilgisayar']))
			throw new Exception('Başka bir bilgisayardan kullanıcı girişi yapıldı. Şu an işleminiz devam edemiyor. Lütfen tekrar giriş yapınız.', 12);
		elseif (isset($_SESSION['zorunlu']) && !str_ends_with($g->tasarim->adres, $_SESSION['zorunlu']))	
			throw new Exception('Bu sayfaya şimdilik erişemezsiniz.', 303);
		elseif (isset($_SESSION['zorunlu']))
			;
		elseif (!$o->isletme_no)
			throw new Exception('İşletme seçilmemiş. Bu sayfaya erişmek için önce işletme seçmelisiniz', 303);
		elseif (!isset(ACL[$g->tasarim->adres]) && $g->tasarim->adres != 'temel/varsayilan/varsayilan')
			throw new Exception('Bu adrese erişim yetkiniz yok. Erişim kontrol listesinden yetki açtırmalısınız', 401);

		require_once DIZIN.'alan/'.$p[0].'/'.ucfirst($p[1]).'Kontrol.php';
		$__sinif = new (ucfirst($p[1]).'Kontrol')($g, $o);
		$__sinif->g = $g;
		$__sinif->o = $o;
		if (!method_exists($__sinif, $p[2].'_eylem')) throw new Exception('Ulasmaya calistiginiz sayfa sistemimizde mevcut degil.', 404);
		list($g->tasarim->alan, $g->tasarim->kontrol, $g->tasarim->eylem) = $p;
		ob_start();
			$yonlendir = call_user_func_array(array($__sinif, $p[2].'_eylem'), array_slice($p, 3)); //$__sinif->{$p[2] . '_eylem'}($g, ...array_slice($p, 3));
			if (!ob_get_level()) break; //bufferdan dosya gönderildi
			$icerik = ob_get_contents();
		ob_end_clean();
		if (is_array($yonlendir) && isset($yonlendir[0]) && $yonlendir[0] == 'git') { $p = array_slice($yonlendir,1); continue; }
		if ($yonlendir || is_array($yonlendir)) $icerik = is_string($yonlendir) ? $yonlendir : (is_array($yonlendir) && isset($yonlendir[0]) && $yonlendir[0] == 'OK' ? implode('|', $yonlendir) : json_encode($yonlendir, JSTR));
		if ($g->tasarim->goster) {
			if ($p[0] == 'temel' && $p[1] == 'hata') $g->tasarim->dosya = 'temel/tasarim/'.TEMA.'_hata';
			else if ($p[0] == 'temel' && $p[1] == 'varsayilan') $g->tasarim->dosya = 'temel/tasarim/varsayilan';
			else $g->tasarim->dosya = $g->tasarim->adres;
			$g->tasarim->sadece_eylem = SINOPSIS !== null || strcasecmp($_SERVER['HTTP_X_REQUESTED_WITH'] ?? '', 'xmlhttprequest') === 0;
			(function() use($icerik, $g, $o, $__sinif, $baslangic_zamani) {
				foreach ($g as $__k12__k => $__v80_i) $$__k12__k = $__v80_i; unset($__k12__k, $__v80_i); //extract(get_object_vars($g), EXTR_REFS);
				if (!$g->tasarim->sadece_eylem) require_once DIZIN.'alan/temel/tasarim/'.TEMA.'_bas.phtml';
				echo '<!--SN:'.$g->tasarim->baslik.($g->tasarim->harita ? ';'.$g->tasarim->harita : '').'-->'.PHP_EOL;
				if (is_file(DIZIN.'alan/'.$g->tasarim->dosya.'.phtml')) {
					ob_start();
					require DIZIN.'alan/'.$g->tasarim->dosya.'.phtml'; 
					ob_end_flush();
				} else echo $icerik;
				if (!$g->tasarim->sadece_eylem) require_once DIZIN.'alan/temel/tasarim/'.TEMA.'_son.phtml';
			})();
		} else {
			if (!headers_sent()) header('Content-Type: '.(!$yonlendir || is_string($yonlendir) || (is_array($yonlendir) && isset($yonlendir[0]) && $yonlendir[0] == 'OK') ? 'text/html' : 'application/json').'; charset=utf-8');
			echo $icerik;
		}
		break;
	} catch (Throwable $e) {
		if (($db = db(true)) && $db->inTransaction()) $db->rollBack();
		if (ob_get_level()) ob_end_clean();
		$kod = $e->getCode();  $mesaj = $e->getMessage(); $dosya = basename($e->getFile(), ".php").'['.$e->getLine(). ']';
		if ($p[0] == 'temel' && $p[1] == 'hata') exit("hata/{$p[2]} fonksiyonunda hata olustu.<br>\r\n".$mesaj);
		if (str_starts_with($dosya,'baslangic') || str_starts_with($dosya, 'KontrolMerkezi'))
			$dosya = '-'.basename($e->getTrace()[0]['file']).'['.$e->getTrace()[0]['line']. ']';

		if (get_class($e) != 'Exception' || $kod > 500)
			error_log($e->getFile().'['.$e->getLine(). ']: '.$mesaj.
						', k:'.($_SESSION['isletme_no'] ?? 0).','.($_SESSION['uye_no']??0).
						($kod == 800 ? ' => '.http_build_query($_POST + $_GET) : '').
						($dosya[0] == '-' ? "\n".$e->getTraceAsString() : ''));
		if (SINOPSIS === false || str_contains(substr($_GET['_wrx'],-6), '.'))
		{
			if (!headers_sent() && is_numeric($kod) && $kod > 400 && $kod <= 500) http_response_code($kod);
			if ($kod == 401 && $mesaj == 'kyok') echo 'Kullanıcı girişi yok[:]Kullanıcı girişi yapılmamış yada mevcut kullanıcı girişi sonlanmış. Bu özelliğe erişebilmek için yeniden <a href="cari/giris" onclick="pencere_kapat();">giriş</a> yapmalısınız.';
			else echo ($kod != 1 ? ($kod == 401 || $kod == 404 ? 'Hata '.$kod : $dosya.' '.(!is_numeric($kod) ? ' - '.$kod : '')).'[:]' : '').nl2br(explode('#=>', $mesaj)[0]);
			break;
		}
		elseif ($kod == 401 || $kod == 404) $p = array('temel', 'hata', 'kod'.$kod, $p[0].'/'.$p[1].'/'.$p[2]);
		elseif ($kod == 500) $p = array('temel', 'hata', 'kod500', $e);
		else $p = array('temel', 'hata', 'goster', $dosya.': '.explode('#=>', $mesaj)[0], $kod);

		//KontrolMerkezi::$tasarim['goster'] = true;
		//if (isset(KontrolMerkezi::$tasarim['o'])) unset(KontrolMerkezi::$tasarim['o']);
	}
}

function cari(object $vtcari, int $uzunluk = 32, bool $ilk_ikon_olsun = true): string {
	$ilk_ikon = []; 
	if ($ilk_ikon_olsun) {
		if ($vtcari->rol_sr & 1) $ilk_ikon[]='stars'; //şirket umbrella-fill stars lightning-charge briefcase building buildings circle-square clouds collection cup diagram-2 duffle flower1 fonts layers
		if ($vtcari->rol_sr & 2) $ilk_ikon[]='diagram-2'; //dist
		if ($vtcari->rol_sr & 4) $ilk_ikon[]='flower3'; //musteri/uye
		if ($vtcari->rol_sr & 8) $ilk_ikon[]='cup'; //çözüm ortakları
		if ($vtcari->rol_sr & 16) $ilk_ikon[]='shop'; //tedarikçi
		if ($vtcari->rol_sr & 32) $ilk_ikon[]='person-fill'; //kullanıcı
		if ($vtcari->rol_sr & 64) $ilk_ikon[]='safe'; //banka
		//if ($vtcari->rol_sr == 0) $ilk_ikon[]='wallet2'; //banka hesabı
	}
	$baslik = ''; $link_var = false;
	foreach (KontrolMerkezi::cari_roller as $cind => $isim) {
		if ($cind && $vtcari->rol_sr & $cind) {
			$baslik .= ($baslik?', ':'').$isim;
			if (isset(ACL['cari/GOR-'.($vtcari->uye_no??0 == $_SESSION['uye_no'] || $vtcari->cari_no == $_SESSION['isletme_no'] ? 'KENDI' : $cind)])) $link_var = true;
		}
	}
	if (!$baslik) $baslik = 'Bilinmeyen Tip '.$vtcari->rol_sr;

	$isim = mb_substr($vtcari->isim,0,$uzunluk).(mb_strlen($vtcari->isim)>$uzunluk ? '...' : '');
	if ($vtcari->durum == 9) $isim = '<span class=text-danger title="İşletme No: '.$vtcari->cari_no.' ('.$baslik.')">'.$isim.'</span>';
	elseif ($vtcari->durum == 8) $isim = '<span class=text-warning title="İşletme No: '.$vtcari->cari_no.' ('.$baslik.')">'.$isim.'</span>';
	else $isim = '<span title="İşletme No: '.$vtcari->cari_no.' ('.$baslik.')">'.$isim.'</span>';


	return	(count($ilk_ikon) ? '<i title="'.$baslik.'" class="bi bi-'.(count($ilk_ikon) > 1 ? 'layers' : $ilk_ikon[0]).'"></i>' : '').
			($link_var ? ' <a sn href="cari/'.($vtcari->cari_no < 700100101 ? 'isletme' : 'personel').'/detay/'.$vtcari->cari_no.'">'.$isim.'</a>' : '<label class="m'.($ilk_ikon_olsun ? 'x' : 'e').'-1">'.$isim.'</label>').
			($vtcari->rol_sr & 2 || $vtcari->rol_sr & 4 || $vtcari->rol_sr & 8 || $vtcari->rol_sr & 16 ?
				(true || isset(ACL['bakiye/hareket']) ? ' <a sn href="bakiye/hareket/'.$vtcari->cari_no.'"><i class="bi bi-sign-intersection-t-fill text-warning" title="Bakiye hareketleri"></i></a>' : '').
				(true || isset(ACL['kumbara/hareket']) ? ' <a sn href="kumbara/hareket/'.$vtcari->cari_no.'"><i class="bi bi-database" title="Kumbara birikimi"></i></a>' : '')
			: '');
}