<?php
/**
 * This class is called to:
 * - retrieve channel settings and configuration, function: get_channel_data
 * - update project configuration during steps, function: update_project
 * - add project configuration to cron option and clear current project config, function: add_project_cron
 */
class Convpfm_UpdateProject {

    public $channel_data;
    public $channel_update;
    private $project_config;
    private $project_hash;

    /**
     * Get generic channel information
     */
        public static function get_channel_data( $channel_hash ) {
        $convpfm_channels = get_option( 'convpfm_channels' );

        foreach ( $convpfm_channels as $key => $val ) {

            foreach ( $val as $k => $v ) {
                if ( $channel_hash === $v['channel_hash'] ) {
                    $channel_data = $v;         
                }
            }
        }
        return $channel_data;
    }

    /**
     * Get project configuration
     */
    public static function get_project_data( $project_hash ) {
        if ( get_option( 'convpfm_cron_files' ) ) {
            $cron_projects  = get_option( 'convpfm_cron_files' );
            $project_config = array();

            foreach ( $cron_projects as $key => $val ) {
                // if(!empty($val)){
                if ( ! empty( $val['project_hash'] ) ) {
                    if ( $val['project_hash'] === $project_hash ) {
                        $project_config = $val;
                    }
                }
            }
            return $project_config;
        }
    }

    /**
     * Update individual project configuration
     */
    public static function update_project_data( $project ) {
        if ( get_option( 'convpfm_cron_files' ) ) {
            $cron_projects = get_option( 'convpfm_cron_files' );

            foreach ( $cron_projects as $key => $val ) {
                if ( ! empty( $val ) ) {
                    if ( $val['project_hash'] === $project['project_hash'] ) {
                        $cron_projects[ $key ] = $project;
                        update_option( 'convpfm_cron_files', $cron_projects, 'no' );
                    }
                }
            }
        }
    }

    public static function update_project( $project_data ) {
        check_ajax_referer( 'convpfm_ajax_nonce', 'security' );

        if ( ! array_key_exists( 'project_hash', $project_data ) ) {
                    $upload_dir    = wp_upload_dir();
                    $external_base = $upload_dir['baseurl'];
                    $external_path = $external_base . '/conversios-product-feed/' . $project_data['fileformat'];
            $convpfm_channels       = get_option( 'convpfm_channels' );

            foreach ( $convpfm_channels as $key => $val ) {

                foreach ( $val as $k => $v ) {
                    if ( $project_data['channel_hash'] == $v['channel_hash'] ) {
                        $project_fill = array_merge( $v, $project_data );

                        // New code to create the project hash so dependency on openSSL is removed
                        $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                        $pieces   = array();
                        $length   = 32;
                        $max      = mb_strlen( $keyspace, '8bit' ) - 1;
                        for ( $i = 0; $i < $length; ++$i ) {
                                $pieces [] = $keyspace[ random_int( 0, $max ) ];
                            }
                            $project_fill['project_hash'] = implode( '', $pieces );
                        $project_fill['filename']         = $project_fill['project_hash'];
                        $project_fill['external_file']    = $external_path . '/' . sanitize_file_name( $project_fill['filename'] ) . '.' . $project_fill['fileformat'];
                        $project_fill['query_log']        = $external_base . '/conversios-product-feed/logs/query.log';
                        $project_fill['query_output_log'] = $external_base . '/conversios-product-feed/logs/query_output.log';
                    }
                }
            }
                    update_option( 'convpfm_channel_files', $project_fill, '' );
        } else {
                    $project_temp = get_option( 'convpfm_channel_files' );
                        if ( is_array( $project_temp ) ) {
                                $project_fill = array_merge( $project_temp, $project_data );
                        } else {
                                $project_fill = $project_data;
                        }
                        update_option( 'convpfm_channel_files', $project_fill, '' );
        }
        return $project_fill;
    }

    /**
     * This function takes care of updating project settings whenever an user updates a project
     */
    public static function reconfigure_project( $project_data ) {
        $project_hash = $project_data['project_hash'];

        if ( get_option( 'convpfm_cron_files' ) ) {
            $cron_projects = get_option( 'convpfm_cron_files' );

            foreach ( $cron_projects as $key => $val ) {
                if ( ! empty( $val ) ) {
                    foreach ( $val as $k => $v ) {
                        if ( ! is_array( $v ) ) {
                            if ( ( $v === $project_hash ) && ( $k === 'project_hash' ) ) {
                                $project_config = $val;
                                $remove_key     = $key;
                            }
                        }
                    }
                }
            }
        }

        /**
         * Update project hash with new values
         */

        foreach ( $project_data as $key => $val ) {
            $project_config[ $key ] = $val;
        }

                /**
                * Update some project configs
                */
                $project_config['last_updated']          = date( 'd M Y H:i' );
                $count_products                          = wp_count_posts( 'product', 'product_variation' );
                $count_variation                         = wp_count_posts( 'product_variation' );
                $count_single                            = wp_count_posts( 'product' );
                $published_single                        = $count_single->publish;
                $published_variation                     = $count_variation->publish;
                $published_products                      = $published_single + $published_variation;
        $project_config['nr_products']                   = $published_products;
                $project_config['nr_products_processed'] = 0;

        /**
         * We might have to change the file extension
         */
        $upload_dir                      = wp_upload_dir();
                $external_base           = $upload_dir['baseurl'];
                $external_path           = $external_base . '/conversios-product-feed/' . $project_config['fileformat'];
        $project_config['external_file'] = $external_path . '/' . sanitize_file_name( $project_config['filename'] ) . '.' . $project_config['fileformat'];

        

        /**
         * Did the product variations support got disabled?
         */
        if ( array_key_exists( 'fileformat', $project_data ) ) {
            if ( ! array_key_exists( 'product_variations', $project_data ) ) {
                unset( $project_config['product_variations'] );
                unset( $project_config['productname_append'] );
            }
        }

        /**
         * Did the default product variations got disabled?
         */
        if ( array_key_exists( 'fileformat', $project_data ) ) {
            if ( ! array_key_exists( 'default_variations', $project_data ) ) {
                unset( $project_config['default_variations'] );
            }
        }

        /**
         * Did the lowest price product variations got disabled?
         */
        if ( array_key_exists( 'fileformat', $project_data ) ) {
            if ( ! array_key_exists( 'lowest_price_variations', $project_data ) ) {
                unset( $project_config['lowest_price_variations'] );
            }
        }

        /**
         * Did the option to only update the feed when products changed got disabled?
         */
        if ( array_key_exists( 'fileformat', $project_data ) ) {
            if ( ! array_key_exists( 'products_changed', $project_data ) ) {
                unset( $project_config['products_changed'] );
            }
        }

        /**
         * Did the option to preview the feed got disabled?
         */
        if ( array_key_exists( 'fileformat', $project_data ) ) {
            if ( ! array_key_exists( 'preview_feed', $project_data ) ) {
                unset( $project_config['preview_feed'] );
            }
        }

        /**
         * Did all the filters got removed
         */
                if ( ( array_key_exists( 'convpfm_page', $project_data ) ) && ( $project_data['convpfm_page'] == 'filters_rules' ) ) {
            if ( ! array_key_exists( 'rules', $project_data ) ) {
                unset( $project_config['rules'] );
            }
        }

        /**
         * Did all the rules got removed
         */
                if ( ( array_key_exists( 'convpfm_page', $project_data ) ) && ( $project_data['convpfm_page'] == 'filters_rules' ) ) {
            if ( ! array_key_exists( 'rules2', $project_data ) ) {
                unset( $project_config['rules2'] );
            }
        }

        /**
         * Did all the field manipulations  got removed
         */
                if ( ( array_key_exists( 'convpfm_page', $project_data ) ) && ( $project_data['convpfm_page'] == 'field_manipulation' ) ) {
            if ( ! array_key_exists( 'field_manipulation', $project_data ) ) {
                unset( $project_config['field_manipulation'] );
            }
        }

        /**
         * Update cron with new project settings
         */
        $add_to_cron = self::add_project_cron( $project_config, $remove_key );

        return $project_config;
    }

    /**
     * This function add's a project configuration to the list of projects needed for the cron
     * it also delete's the current project configuration from the channel_project option for a next project
     */
    public static function add_project_cron( $project_data, $key ) {
        if ( get_option( 'convpfm_cron_files' ) ) {
            $cron_projects = get_option( 'convpfm_cron_files' );
            if ( is_int( $key ) ) {
                $cron_projects[ $key ] = $project_data;
            } else {
                array_push( $cron_projects, $project_data );
            }
            update_option( 'convpfm_cron_files', $cron_projects );
        } else {
            $cron_projects = array(); // Create a new multidimensional array for the cron projects
            array_push( $cron_projects, $project_data );
            update_option( 'convpfm_cron_files', $cron_projects );
        }

        // Clear channel_project option
        delete_option( 'convpfm_channel_files' );
    }
}
