<?php
// phpcs:disable WordPress.WP.AlternativeFunctions.file_system_operations_fwrite
if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly
}

include_once 'abstract-class-woe-formatter-plain-format.php';

/**
 * Class WOE_Formatter_PDF
 *
 * Using CSV formatter as basis. Works like CSV (even creates csv file) but after finish,
 * fetches data from file and paste them to PDF as table
 */
class WOE_Formatter_Html extends WOE_Formatter_Plain_Format {

     protected $css;
     protected $table_header_row;
     protected $image_format_fields;

     public function __construct(
		$mode,
		$filename,
		$settings,
		$format,
		$labels,
		$field_formats,
		$date_format,
		$offset
	) {
		parent::__construct( $mode, $filename, $settings, $format, $labels, $field_formats, $date_format, $offset );

		$this->css = $this->get_prepared_css();

		//to support IMAGES
		$field_formats = $this->field_formats['order']; // overwrite! probably modified by parent
		$this->image_format_fields = isset( $field_formats['image'] ) ? $field_formats['image'] : array();
		$this->image_format_fields = apply_filters( "woe_{$format}_image_format_fields", $this->image_format_fields );
	}

	public function start( $data = '' ) {
		$data = $this->make_header( $data );
		$data = apply_filters( "woe_{$this->format}_header_filter", $data );
		$this->prepare_array( $data );
		parent::start( $data );

		$this->table_header_row = $data;

		if ( $this->mode != 'preview' ) {

		    $this->set_table_header_row($this->table_header_row);

		    if( $this->settings['custom_css'] )
			$this->css['style'] = '';

			$meta_encoding = apply_filters("woe_html_meta_encoding", '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />');
		    fwrite( $this->handle, '<html><head>' . $meta_encoding . '<style type="text/css">'.$this->css['style'].$this->settings['custom_css'].'</style></head><body>' );

			do_action( "woe_html_print_body_start", $this->handle, $this );

		}

		if ( ! empty( $this->settings['display_column_names'] ) AND $data ) {
			if ( $this->mode == 'preview' ) {
			    $this->rows[] = $data;
			} else {

				if ( $this->settings['header_text'] ) {
				    fwrite( $this->handle, '<div class="header">' . $this->settings['header_text'] . '</div>' );
				}

				if( apply_filters( "woe_html_header_print_table", true) )
					fwrite( $this->handle, '<table>' );

				do_action( "woe_before_{$this->format}_print_header", $this->handle, $data, $this );

				if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $data, true ) ) {
				    fwrite( $this->handle, '<thead><tr><th>' . join( '</th><th>', $data ) . "</th></tr></thead>\n" );
				}

				do_action( "woe_{$this->format}_print_header", $this->handle, $data, $this );
			}
		} else {
			if ( $this->mode !== 'preview' ) {
				if ( $this->settings['header_text'] ) {
				    fwrite( $this->handle, '<div class="header">' . $this->settings['header_text'] . '</div>' );
				}

				if( apply_filters( "woe_html_header_print_table", true) )
					fwrite( $this->handle, '<table>' );
			}
		}
	}

	public function output( $rec ) {
		$rows = parent::output( $rec );

		$images_add_link = $this->mode != 'preview' ? wc_string_to_bool( $this->settings['images_add_link'] ) : false;

		foreach ( $rows as $row ) {
			$this->prepare_array( $row );
			if ( $this->has_output_filter ) {
				$row = apply_filters( "woe_{$this->format}_output_filter", $row, $this );
				if ( ! $row ) {
					continue;
				}
			}

			//to support IMAGES
			foreach ( $row as $column => &$cell ) {
				if ( $this->field_format_is( $column, $this->image_format_fields ) ) {
					$html = $this->make_img_html_from_path(
						$cell,
						$this->settings['row_images_width'],
						$this->settings['row_images_height'],
						$images_add_link
					);
					$cell = $html ? $html : "";
				}
			}

			if ( $this->mode == 'preview' ) {
				$this->rows[] = $row;
			} else {

				if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $row, false ) ) {

				    fwrite( $this->handle, '<tr><td>' . join( '</td><td>', $row ) . "</td></tr>\n" );

				}
			}
		}

	}

	public function finish() {
		$this->try_apply_summary_report_fields();

		if ( $this->mode == 'preview' ) {

			if( $this->settings['custom_css'] ) {
				foreach( $this->css['inline'] as $k=>$v)
					$this->css['inline'][$k]  = '';
			}

			$this->rows = apply_filters( "woe_{$this->format}_preview_rows", $this->rows );

			fwrite( $this->handle, '<div style="'.$this->css['inline']['body'].'">' );

			if ( $this->settings['header_text'] ) {
			    fwrite( $this->handle, '<div class="header" style="'.$this->css['inline']['header'].'">' . $this->settings['header_text'] . '</div>' );
			}

			if( apply_filters( "woe_html_header_print_table", true) )
				fwrite( $this->handle, '<table>' );
			if ( $this->settings['display_column_names'] && count( $this->rows ) < 2 || count( $this->rows ) < 1 ) {
				$this->rows[] = array( '<td colspan=10 style="'.$this->css['inline']['td'].'"><b>' . __( 'No results', 'woo-order-export-lite' ) .'</b></td>' );
			}
			foreach ( $this->rows as $num => $rec ) {
				if ( $num == 0 AND ! empty( $this->settings['display_column_names'] ) ) {
				    fwrite( $this->handle,
					'<thead><tr><th style="'.$this->css['inline']['th'].'">' . join( '</th><th style="'.$this->css['inline']['th'].'">', $rec ) . "</th></tr></thead>\n" );
				} else {
					fwrite( $this->handle, '<tr><td style="'.$this->css['inline']['td'].'">' . join( '</td><td style="'.$this->css['inline']['td'].'">', $rec ) . "</td></tr>\n" );
				}
			}

			if (! empty( $this->settings['display_column_names'] ) && ! empty( $this->settings['repeat_header_last_line'] ) && $this->table_header_row) {
			    fwrite( $this->handle, '<tfoot><tr><th style="'.$this->css['inline']['th'].'">' . join( '</th><th style="'.$this->css['inline']['th'].'">', $this->table_header_row ) . "</th></tr></tfoot>\n" );
			}

			if( apply_filters( "woe_html_header_print_table", true) )
				fwrite( $this->handle, '</table>' );

			if ( $this->settings['footer_text'] ) {
			    fwrite( $this->handle, '<div class="footer" style="'.$this->css['inline']['footer'].'">' . $this->settings['footer_text'] . '</div>' );
			}

			fwrite( $this->handle, '</div>' );

		} else {
			do_action( "woe_{$this->format}_print_footer", $this->handle, $this );

			$this->table_header_row = $this->get_table_header_row();

			if (! empty( $this->settings['display_column_names'] ) && ! empty( $this->settings['repeat_header_last_line'] ) && $this->table_header_row) {
			    if ( ! apply_filters( "woe_{$this->format}_custom_output_func", false, $this->handle, $this->table_header_row, true ) ) {
				fwrite( $this->handle, '<tfoot><tr><th>' . join( '</th><th>', $this->table_header_row ) . "</th></tr></tfoot>\n" );
			    }
			}

			if( apply_filters( "woe_html_header_print_table", true) )
				fwrite( $this->handle, '</table>' );

			if ( $this->settings['footer_text'] ) {
			    fwrite( $this->handle, '<div class="footer">' . $this->settings['footer_text'] . '</div>' );
			}

			do_action( "woe_html_print_body_end", $this->handle, $this );

			fwrite( $this->handle, '</body></html>' );
		}
		parent::finish();
	}

	protected function prepare_array( &$arr ) {
	}

	protected function get_prepared_css() {

	    $default_css = array();

	    if ($this->settings['font_size']) {
		$default_css['font-size'] = $this->settings['font_size'] . 'px';
	    }

	    $default_header_css = array();

	    if ( $this->settings['header_text_color'] ) {
		$default_header_css['color'] = $this->settings['header_text_color'];
	    }

	    $default_footer_css = array();

	    if ( $this->settings['footer_text_color'] ) {
		$default_footer_css['color'] = $this->settings['footer_text_color'];
	    }

	    $align = "left";

	    switch($this->settings['cols_align']) {
		case 'L':
		    $align = "left";
		    break;
		case 'R':
		    $align = "right";
		    break;
		case 'C':
		    $align = "center";
		    break;
	    }

	    $default_th_css = array('text-align' => $align, 'font-weight' => 'bold');
	    $default_td_css = array('text-align' => $align);

	    if ( $this->settings['table_header_text_color'] ) {
		$default_th_css['color'] = $this->settings['table_header_text_color'];
	    }

	    if ( $this->settings['table_header_background_color'] ) {
		$default_th_css['background-color'] = $this->settings['table_header_background_color'];
	    }

	    if ( $this->settings['table_row_text_color'] ) {
		$default_td_css['color'] = $this->settings['table_row_text_color'];
	    }

	    if ( $this->settings['table_row_background_color'] ) {
		$default_td_css['background-color'] = $this->settings['table_row_background_color'];
	    }

	    $css = array();

	    $default = array(
		'body'	 => $default_css,
		'header' => $default_header_css,
		'footer' => $default_footer_css,
		'th'	 => $default_th_css,
		'td'	 => $default_td_css,
	    );

	    foreach ($default as $key => $tmp) {

		$tmp_css = array();

		foreach ($tmp as $p => $s) {
		    $tmp_css[] = sprintf('%s: %s', $p, $s);
		}

		$css[$key] = implode('; ', $tmp_css);
	    }

	    $style = '
		body, .header, .footer, table th, table td {'.$css['body'].'}
		table th {'.$css['th'].'}
		table td {'.$css['td'].'}
		.header {'.$css['header'].'}
		.footer {'.$css['footer'].'}
	    ';

	    return array(
		'style' => $style,
		'inline'=> $css,
	    );
	}

	public function get_table_header_row() {
	    return get_transient($this->get_transient_key_table_header_row());
	}

	public function set_table_header_row($row) {
	    return set_transient($this->get_transient_key_table_header_row(), $row, 5 * MINUTE_IN_SECONDS);
	}

	public function get_transient_key_table_header_row() {
	    return 'woocommerce-order-file-'. str_replace('/', '-', $this->filename) .'-html-table-header-row';
	}

}
