<?php

function cx_require(...$segments) {
	array_unshift($segments, CX_PATH);
	require_once(join(DIRECTORY_SEPARATOR, $segments));
}

define('CX_PATH', __DIR__);

cx_require('lib', 'admin.php');
cx_require('lib', 'form.php');
cx_require('lib', 'http.php');
cx_require('lib', 'images.php');
cx_require('lib', 'posts.php');
cx_require('lib', 'sessions.php');
cx_require('lib', 'setup.php');
cx_require('lib', 'site.php');
cx_require('lib', 'system.php');
cx_require('lib', 'template.php');
cx_require('lib', 'url.php');
cx_require('lib', 'user_data.php');
cx_require('lib', 'users.php');

function cx($db_path, $data_folder_path, $public_data_folder_path) {
	define('CX_DATABASE_FILE', $db_path);
	define('CX_USER_DATA_PATH', $data_folder_path);
	define('CX_PUBLIC_USER_DATA_PATH', $public_data_folder_path);

	if (cx_setup_required()) {
		cx_setup_run();

		require('../setup.php');
		$new_author = cx_users_add_user(CX_SETUP_USER, CX_SETUP_PASSWORD);
		$new_site = cx_sites_add_site(CX_SETUP_URL, CX_SETUP_TITLE, CX_SETUP_BYLINE, CX_SETUP_COPYRIGHT);
		cx_sites_site_add_user($new_site, $new_author, true);

		exit;
	}

	$path = '/';

	if (isset($_SERVER['REQUEST_URI'])) {
		$route_details = parse_url($_SERVER['REQUEST_URI']);
		if (isset($route_details['path'])) {
			$path = $route_details['path'];
		}
	}

	$script_name = $_SERVER['SCRIPT_NAME'];
	$script_name_len = strlen($script_name);
	if (substr_compare($path, $script_name, 0, $script_name_len) == 0) {
		$path = substr($path, $script_name_len);
	}

	cx_route($path);
}

function cx_route($path) {
	$path_components = explode('/', $path, 10);
	$path_components = array_filter($path_components);
	$path_components = array_values($path_components); // re-index

	$template = null;
	$template_class = 'public';
	$template_variables = [];

	if (count($path_components) == 0) {
		$template = 'list';
		$template_variables['page_number'] = 0;
	} else if (cx_template_has_content('public', $path)) {
		cx_template_output_content('public', $path);
		exit(0);
	} else if (cx_template_has_content('admin', $path)) {
		cx_template_output_content('admin', $path);
		exit(0);
	} else if (count($path_components) >= 1 && $path_components[0] == 'feed') {
		header('Content-type: application/atom+xml;');
		$template = 'atom';
	} else if (count($path_components) >= 1 && $path_components[0] == 'cx') {
		if (count($path_components) >= 2 && $path_components[1] == 'login') {
			if (cx_admin_logged_in()) {
				cx_http_redirect(cx_url_admin('/'));
				exit(0);
			} else {
				$username = cx_form_input_sanitized('id');
				$password = cx_form_input_sanitized('password');
	
				if ($username != null && $password != null && cx_admin_login($username, $password)) {
					cx_http_redirect(cx_url_admin('/'));
					exit(0);
				}
	
				$template_class = 'admin';
				$template = 'login';
			}
		} else {
			if (cx_admin_logged_in() == false) {
				cx_http_redirect(cx_url_admin('/login/'));
				exit(0);
			} else {
				if (count($path_components) >= 2 && $path_components[1] == 'logout') {
					cx_admin_logout();
					cx_http_redirect(cx_url_admin('/'));
					exit(0);
				} else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'add') {
					$template_variables['post_id'] = '0';
					$template_variables['post_title'] = '';
					$template_variables['post_slug'] = '';
					$template_variables['post_date'] = '';
					$template_variables['post_data'] = '';
					$template_variables['post_is_page'] = false;
					$template_variables['post_is_draft'] = true;
					$template_variables['post_nav_index'] = '';

					$template_class = 'admin';
					$template = 'post';
				} else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'edit') {
					$post = cx_posts_find_post($_GET['id']);

					$template_variables['post_id'] = $post->id;
					$template_variables['post_title'] = $post->title;
					$template_variables['post_slug'] = $post->slug;
					$template_variables['post_date'] = $post->date;
					$template_variables['post_data'] = $post->data;
					$template_variables['post_is_page'] = $post->is_page;
					$template_variables['post_is_draft'] = $post->is_draft;
					$template_variables['post_nav_index'] = $post->nav_index;

					$template_class = 'admin';
					$template = 'post';
				} else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'update') {
					$title = cx_form_input_sanitized('post_title');
					$slug = cx_form_input_sanitized('post_slug');
					if (isset($slug) == false) $slug = null;
					$date = cx_form_input_sanitized_date_time('post_date');
					if (isset($date) == false) $date = null;
					$is_page = cx_form_input_sanitized('post_is_page') == 'page';
					$is_draft = cx_form_input_sanitized('post_is_draft') == 'draft';
					$nav_index = cx_form_input_sanitized('post_nav_index');
					$data = cx_form_input_sanitized_allowing_html('post_data');
					
					if (isset($_GET['id']) == false or $_GET['id'] == 0) {
						$id = cx_posts_add_post(1, $title, $slug, $date, $is_page, $is_draft, $nav_index, $data);
					} else {
						$id = $_GET['id'];
						cx_posts_update_post($id, $title, $slug, $date, $is_page, $is_draft, $nav_index, $data);
					}
					
					cx_http_redirect(cx_url_admin('/posts/edit?id=' . $id));
					exit(0);
				} else if (count($path_components) >= 3 && $path_components[1] == 'posts' && $path_components[2] == 'delete') {
					cx_posts_delete_post($_GET['id']);
					cx_http_redirect(cx_url_admin('/'));
					exit(0);
				} else if (count($path_components) >= 3 && $path_components[1] == 'images' && $path_components[2] == 'add') {
					$template_variables['image_id'] = '0';
					$template_variables['image_alt_text'] = '';
					
					$template_class = 'admin';
					$template = 'image';
				} else if (count($path_components) >= 3 && $path_components[1] == 'images' && $path_components[2] == 'update') {
					$alt_text = cx_form_input_sanitized('image_alt_text');

					$filename = $_FILES['image_file']['tmp_name'];
					$original_filename = $_FILES['image_file']['name'];

					cx_images_add_image(1, $alt_text, $filename, $original_filename);
					
					cx_http_redirect(cx_url_admin('/'));
					exit(0);
				} else {
					$template_class = 'admin';
					$template = 'main';
				}
			}
		}
	} else if (count($path_components) >= 2 && $path_components[0] == 'page') { // FIXME sometime, needs more flexibility...
		$page_number = $path_components[1];

		$template = 'list';
		$template_variables['page_number'] = $page_number;
	} else {
		if (count($path_components) >= 1) {
			$slug = $path_components[0];
			$page_id = cx_posts_find_page_id($slug, include_drafts: cx_admin_logged_in());
			if ($page_id) {
				$template = 'post';
				$template_variables['post_id'] = $page_id;
			}
		}

		if ($template == null && count($path_components) >= 3) { // FIXME sometime, needs more flexibility...
			$year = $path_components[0];
			$month = $path_components[1];
			$slug = $path_components[2];
			$post_id = cx_posts_find_article_id($slug, include_drafts: cx_admin_logged_in());
			if ($post_id) {
				$template = 'post';
				$template_variables['post_id'] = $post_id;
			}
		}
	}

	if ($template != null) {
		$output = cx_template_render($template_class, $template, $template_variables);
		echo($output);
	} else {
		http_response_code(404);
		exit(0);
	}
}
