<?php
/**
 * Class: wcjp_Model_Code
 * @author Flipper Code <hello@flippercode.com>
 * @package Core
 * @version 2.0.0
 */

if ( ! class_exists( 'WCJP_Model_Code' ) ) {

	/**
	 * Code model for CRUD operation.
	 * @package Core
	 * @author Flipper Code <hello@flippercode.com>
	 */
	class WCJP_Model_Code extends FlipperCode_Model_Base
	{
		/**
		 * Validations on code properies.
		 * @var array
		 */
		public $validations = array(
		'data_title' => array( 'req' => 'Please enter title.' ),
		'data_source' => array( 'req' => 'Please enter source code.' ),

		);
		/**
		 * Intialize rule object.
		 */
		public function __construct() {
			$this->table = WCJP_TBL_CODES;
			$this->unique = 'id';
		}
		/**
		 * Admin menu for CRUD Operation
		 * @return array Admin meny navigation(s).
		 */
		public function navigation() {

			return array(
			'wcjp_addcss_code' => __( 'Add CSS', WCJP_TEXT_DOMAIN ),
			'wcjp_managecss_code' => __( 'Manage CSS', WCJP_TEXT_DOMAIN ),
			'wcjp_addjs_code' => __( 'Add JS', WCJP_TEXT_DOMAIN ),
			'wcjp_managejs_code' => __( 'Manage JS', WCJP_TEXT_DOMAIN ),
			'wcjp_addphp_code' => __( 'Add PHP', WCJP_TEXT_DOMAIN ),
			'wcjp_managephp_code' => __( 'Manage PHP', WCJP_TEXT_DOMAIN ),
			);

		}
		/**
		 * Install table associated with Code entity.
		 * @return string SQL query to install wce_editor_content table.
		 */
		public function install() {

			global $wpdb;
			$sql = 'CREATE TABLE '.$wpdb->prefix.'wce_editor_content (
			  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
			  `data_title` varchar(100) NOT NULL,
			  `data_type` varchar(30) NOT NULL,
			  `data_source` longtext NOT NULL,
			  `data_cond` varchar(60) NOT NULL,
			  `tag_name` varchar(100) NOT NULL,
              `accept_args` int(11) NOT NULL,
              `status` tinyint(1) NOT NULL DEFAULT "1",
			   PRIMARY KEY (`id`)
              )';

			return $sql;
		}
		/**
		 * Get Rule(s)
		 * @param  array $where  Conditional statement.
		 * @return array         Array of Rule object(s).
		 */
		public function fetch($where = array()) {

			$objects = $this->get( $this->table, $where );

			if ( isset( $objects ) ) {
				return $objects;
			}
		}

		/**
		 * Add or Edit Operation.
		 */
		public function save() {
			$data = array();
			$entityID = '';
			if ( isset( $_REQUEST['_wpnonce'] ) ) {
				$nonce = sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ); }

			if ( isset( $nonce ) and ! wp_verify_nonce( $nonce, 'wpgmp-nonce' ) ) {

				die( 'Cheating...' );

			}

			$this->verify( $_POST );

			if ( is_array( $this->errors ) and ! empty( $this->errors ) ) {
				$this->throw_errors();
			}

			if ( isset( $_POST['entityID'] ) ) {
				$entityID = intval( wp_unslash( $_POST['entityID'] ) );
			}

			if ( $entityID > 0 ) {
				$where[ $this->unique ] = $entityID;
			} else {
				$where = '';
			}

			$data['data_title'] = sanitize_text_field( wp_unslash( $_POST['data_title'] ) );
			$data['data_source'] = wp_unslash( $_POST['data_source'] );
			$data['data_type'] = sanitize_text_field( wp_unslash( $_POST['data_type'] ) );
			$data['data_cond'] = sanitize_text_field( wp_unslash( $_POST['data_cond'] ) );
			$data['tag_name'] = sanitize_text_field( wp_unslash( $_POST['tag_name'] ) );
			if ( isset( $_POST['status'] ) ) {
				$data['status'] = 0;
			} else {
				$data['status'] = 1;
			}

			$result = FlipperCode_Database::insert_or_update( $this->table, $data, $where );

			if ( false === $result ) {
				$response['error'] = __( 'Something went wrong. Please try again.',WCJP_TEXT_DOMAIN );
			} elseif ( $entityID > 0 ) {
				$response['success'] = __( 'Code updated successfully',WCJP_TEXT_DOMAIN );
			} else {
				$response['success'] = __( 'Code added successfully.',WCJP_TEXT_DOMAIN );
			}
			return $response;
		}

		/**
		 * Delete rule object by id.
		 */
		public function delete() {
			if ( isset( $_GET['id'] ) ) {
				$id = intval( wp_unslash( $_GET['id'] ) );
				$connection = FlipperCode_Database::connect();
				$this->query = $connection->prepare( "DELETE FROM $this->table WHERE $this->unique='%d'", $id );
				return FlipperCode_Database::non_query( $this->query, $connection );
			}
		}

	}
}
