<?php


namespace ColibriWP\Theme\Core;


class Utils {

    public static function camel2dashed( $string ) {
        return strtolower( preg_replace( '/([a-zA-Z])(?=[A-Z])/', '$1-', $string ) );
    }

    public static function replace_file_extension( $filename, $old_extenstion, $new_extension ) {

        return preg_replace( '#\\' . $old_extenstion . '$#', $new_extension, $filename );
    }

    public static function pathSet( &$data, $path, $value ) {
        if ( ! is_array( $path ) ) {
            $path = preg_replace( "#\.\.+#", '.', $path );
            $path = explode( ".", (string) $path );
        }

        $ref = &$data;

        foreach ( $path as $parent ) {
            if ( isset( $ref ) && ! is_array( $ref ) ) {
                $ref = array();
            }

            $ref = &$ref[ $parent ];
        }

        $ref = $value;

        return $data;
    }

    public static function recursiveOnly( $from, $except ) {

        foreach ( $from as $key => $value ) {
            if ( ! in_array( $key, $except ) ) {
                unset( $from[ $key ] );
            } else {
                if ( is_array( $value ) ) {
                    $from[ $key ] = static::recursiveOnly( $value, $except );
                }
            }
        }

        return $from;
    }

    public static function recursiveWithout( $from, $except ) {

        foreach ( $from as $key => $value ) {
            if ( in_array( $key, $except ) ) {
                unset( $from[ $key ] );
            } else {
                if ( is_array( $value ) ) {
                    $from[ $key ] = static::recursiveWithout( $value, $except );
                }
            }
        }

        return $from;
    }

    public static function arrayGetAt( $array, $index = 0, $fallback = false ) {
        return Utils::pathGet( $array, (string) $index, $fallback );
    }


    /**
     * @param $data
     * @param string|null $path
     * @param string|null $fallback
     *
     * @return mixed|null
     */
    public static function pathGet( $data, $path = null, $fallback = null ) {

        if ( strlen( $path ) === 0 || $path === null ) {
            return $data;
        }

        $path = preg_replace( "#\.\.+#", '.', $path );

        $result = $data;

        $path = explode( ".", $path );

        if ( count( $path ) ) {
            foreach ( $path as $key ) {

                if ( ! isset( $result[ $key ] ) ) {
                    $result = $fallback;
                    break;
                }

                $result = $result[ $key ];
            }
        }

        return $result;

    }

    public static function flatten( $array, $prefix = '' ) {
        $return = array();

        foreach ( $array as $key => $value ) {
            $key = trim( "{$prefix}.{$key}", '.' );
            if ( ! is_array( $value ) ) {
                $return[ $key ] = $value;
            } else {
                $return = array_merge( $return, static::flatten( $value, $key ) );
            }
        }

        return $return;
    }

    public static function slugify( $text ) {
        // replace non letter or digits by -
        $text = preg_replace( '~[^\pL\d]+~u', '-', $text );

        // transliterate
        $text = iconv( 'utf-8', 'us-ascii//TRANSLIT', $text );

        // remove unwanted characters
        $text = preg_replace( '~[^-\w]+~', '', $text );

        // trim
        $text = trim( $text, '-' );

        // remove duplicate -
        $text = preg_replace( '~-+~', '-', $text );

        // lowercase
        $text = strtolower( $text );

        if ( empty( $text ) ) {
            return 'n-a';
        }

        return $text;
    }

    public static function buffer_wrap( $callback, $strip_tags = false ) {
        ob_start();
        call_user_func( $callback );
        $content = ob_get_clean();

        if ( $strip_tags ) {
            $content = strip_tags( $content );
        }

        return $content;
    }


    /**
     * @param array $array
     * @param array|string $key
     *
     * @return array
     */
    public static function pathDelete( $array, $key ) {
        $keys = ( array ) $key;

        foreach ( $keys as $key ) {
            $key_parts = explode( ".", $key );
            $ref       = &$array;

            while ( count( $key_parts ) ) {
                $key_part = array_shift( $key_parts );
                if ( array_key_exists( $key_part, $ref ) ) {

                    if ( count( $key_parts ) === 0 ) {
                        unset( $ref[ $key_part ] );
                    } else {
                        $ref = &$array[ $key_part ];
                    }
                } else {
                    break;
                }
            }

        }

        return $array;

    }

    public static function sanitizeSelectControl( $control_data, $current_value ) {
        $possible_values = array_keys( Utils::pathGet( $control_data, 'choices', array() ) );

        if ( $linked_to = Utils::pathGet( $control_data, 'linked_to', false ) ) {
            $possible_values = array();
            $values          = Utils::pathGet( $control_data, 'choices', array() );

            foreach ( $values as $linked_values ) {
                $possible_values = $possible_values + array_keys( $linked_values );
            }

            $possible_values = array_unique( $possible_values );
        }

        if ( in_array( $current_value, $possible_values ) ) {
            return $current_value;
        }

        return null;
    }

    public static function sanitizeEscapedJSON( $value ) {
        if ( json_decode( urldecode( $value ) ) ) {
            return $value;
        }

        return null;
    }
}
