<?php
namespace GOSMTP;

/**
* Class Logger.
*
* @since 1.0.0
*/
class Logger{
	
	public $table;

	public function __construct(){
		global $wpdb;
		
		$this->table = $wpdb->prefix . GOSMTP_DB_PREFIX .'email_logs';
	}

	public function create_table(){
		global $wpdb;
		
		$charsetCollate = $wpdb->get_charset_collate();

		if($wpdb->get_var("SHOW TABLES LIKE '$this->table'") == $this->table){
			return;
		}

		$sql = "CREATE TABLE $this->table (
		`id` INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
		`site_id` INT UNSIGNED NULL,
		`message_id` VARCHAR(255) NULL,
		`to` VARCHAR(255),
		`from` VARCHAR(255),
		`subject` VARCHAR(255),
		`body` LONGTEXT NULL,
		`headers` LONGTEXT NULL,
		`attachments` LONGTEXT NULL,
		`status` VARCHAR(20) DEFAULT 'pending',
		`response` TEXT NULL,
		`extra` TEXT NULL,
		`retries` INT UNSIGNED NULL DEFAULT 0,
		`resent_count` INT UNSIGNED NULL DEFAULT 0,
		`provider`  TEXT NULL,
		`source` VARCHAR(255) NULL,
		`created_at` TIMESTAMP NULL,
		`updated_at` TIMESTAMP NULL,
		`parent_id` INT UNSIGNED NULL DEFAULT 0
		) $charsetCollate;";
		
		// Make Sitepad compatible 
		$upgrade = ABSPATH . 'site-admin/includes/upgrade.php';
		$upgrade = file_exists($upgrade) ? $upgrade : ABSPATH . 'wp-admin/includes/upgrade.php';
		require_once( $upgrade );

		dbDelta($sql);
	}

	public function add_logs($data){
		global $wpdb;

		if(empty($data)){
			return false;
		}

		$result = $wpdb->insert($this->table, $data);
		
		if($result){
			return $wpdb->insert_id;
		}
		
		return false;
	}

	public function update_logs($data, $id){
		global $wpdb;
		
		if(empty($data) || empty($id)){
			return false;
		}
		
		$result = $wpdb->update( $this->table, $data, array( 'id' => $id ) );
		
		if($result){
			return true;
		}
		
		return false;
	}


	public function delete_log($id){
		global $wpdb;

		$data['id'] = $id;
		$result = $wpdb->delete($this->table, $data);
		
		if(!empty($result)){
			return true;
		}
		
		return false;
	}

	public function get_logs($for = 'records', $id = '', $args = array()){
		global $wpdb;
		
		$defaults = array(
			'interval' => array(),
			'limit' => 10,
			'offset' => 0,
			'pagination' => true,
			'multiselect' => array(),
		);
		
		$args = wp_parse_args( $args, $defaults );

		$query = '';
		$start = '';
		$end = date('y-m-d').' 23:59:59';
		
		if(!empty($args['filter'])){
			$query .= 'status="'.$args['filter'].'"';
		}
		
		if(!empty($args['interval']) && !empty($args['interval']['start'])){
			
			$start = $args['interval']['start'].' 00:00:00';
			
			if(!empty($args['interval']['end'])){
				$end = $args['interval']['end'].' 23:59:59';
			}
			
			$query .= (!empty($query) ? ' and (' : '').'`created_at` between "'.$start.'" and "'.$end.'" '.(!empty($query) ? ') ' : ' ');
		}

		if(!empty($args['search']) && empty($args['multiselect'])){
			$query .=  (!empty($query) ? ' and ' : '').' (
				`from` like "%'. $args['search'] .'%" or 
				`subject` like "%'. $args['search'] .'%" or 
				`to` like "%'. $args['search'] .'%" or 
				`body` like "%'. $args['search'] .'%" )';
		}else if(!empty($args['search'])){
			$search_qry ='';
			
			foreach($args['multiselect'] as $key => $value){
				$search_qry .= '`'.$value.'` like "%'.$args['search'].'%"';
				
				if(count($args['multiselect']) - 1 > $key){
					$search_qry .= ' or ';
				}	
			}
			
			$query .= (!empty($query) ? ' and ' : '').' ('.$search_qry.')';
		}

		if(!empty($query)){
			$query = ' where '.$query;
		}

		if(!empty($id)){
			$query = ' where id='.$id;
		}else if(!empty($args['pagination'])){
			$query .= $for != 'count' ? ' order by id desc LIMIT '.$args['limit'].' OFFSET '.$args['offset'] : ' ';
		}
		
		// echo "SELECT * FROM ".$this->table. $query;

		try{
			if($for == 'count'){
				$result = $wpdb->get_results("SELECT count(*) as records FROM ".$this->table. $query)[0];
			}else{
				$result = $wpdb->get_results("SELECT * FROM ".$this->table. $query);
				if( count($result) == 0 ){
					return false;
				}
			}
			
			return $result;
		}catch(\Exception $e){}
		
		return false;
	}

	public function clear_records( $period = 0 ){
		
		if( empty($period) || $period == 0 ) return;
		
		global $wpdb;
		
		$date = ( new \DateTime( '-'.$period.' seconds' ))->format('Y-m-d H:i:s');
		$query = 'DELETE FROM `'.$this->table.'` WHERE created_at < %s';
		if( $period == -1 ){
			$query = 'TRUNCATE TABLE '.$this->table;
			$date = '';
		}
		
		$wpdb->query(
			$wpdb->prepare( $query , $date)
		);
	}
	
	public static function retention_logs(){
		global $gosmtp;
		
		if(empty($gosmtp->options['logs']['retention_period'])){
			return;
		}

		$logger = new Logger();
		
		// Clear logs
		$logger->clear_records($gosmtp->options['logs']['retention_period']);
	}
}