<?php

class my_less extends lessc {

  private $default_vars = array();

  function __construct() {
    parent::__construct();

    // Images path
    define('CSS_IMAGES_PATH', get_template_directory_uri()."/images/");
    $this->color_schemes_arr = array('al_pacino', 'blue_sky', 'dark_night', 'black_and_white', 'pinkman', 'space', 'grey_clouds', 'almond_milk', 'clear_white', 'sakura', 'mighty_slate', 'retro_orange');
  }

  public function get_var($default_key, $default_value){
    if(isset($this->default_vars["{$default_key}"]))
      return $this->default_vars["{$default_key}"];
    else
      return $default_value;
  }

  public function load_defaults()
  {
    $scheme_vars = array();
    $color_scheme = $this->get_current_color_scheme();
    // load default color scheme settings
    require_once( get_template_directory() . "/inc/colors/default.php");
    if(!in_array($color_scheme, $this->color_schemes_arr)){
      $color_scheme = "blue_sky";
    }
    // load selected colors scheme settings
    require_once( get_template_directory() . "/inc/colors/{$color_scheme}.php" );
    // load custom variables you want to override
    require_once( get_template_directory() . '/extend/custom_scheme_vars.php' );
    $this->default_vars = $scheme_vars;
  }

  public static function get_current_color_scheme()
  {
    if(isset($_SESSION['color_scheme'])){
      $color_scheme = $_SESSION['color_scheme'];
    }else{
      $color_scheme = get_field('color_scheme', 'option');
    }
    return $color_scheme;
  }


  // **************************************************
  // **************************************************
  // **************************************************

  // SETTING LESS CSS VARIABLES FROM THE ADMIN OPTIONS

  // **************************************************
  // **************************************************
  // **************************************************


  function my_less_vars( $vars, $handle ) {
    $this->load_defaults();
    $vars = $this->default_vars;
    $vars[ 'plutoFolderPath' ] = "'".get_template_directory_uri()."'";
    $vars[ 'imagesPath' ] = "'".get_template_directory_uri()."/assets/images'";
    $vars[ 'fontsPath' ] = "'".get_template_directory_uri()."/assets/fonts'";
    $vars[ 'logoImageHeight' ] = $this->custom_or_default('logo_image_height', 'logoImageHeight', '40px');
    $vars[ 'topMenuLogoImageHeight' ] = $this->custom_or_default('top_menu_logo_image_height', 'topMenuLogoImageHeight', '20px');
    $vars[ 'fixedPostHeight' ] = '200px';

    if (get_field('logo_type', 'option') == 'text'){
      $vars[ 'logoFontSize' ] = $this->custom_or_default('logo_font_size', 'logoFontSize', '24px');
      $vars[ 'logoPadding' ] = '8px';
    }else{
      $vars[ 'logoFontSize' ] = '24px';
      $vars[ 'logoPadding' ] = '0px';
    }

    if(get_field('no_limit_single_post_width', 'option') != true){
      if(get_field('single_post_maximum_width', 'option')){
        $vars[ 'singlePostMaxWidth' ] = $this->add_px(get_field('single_post_maximum_width', 'option'));
      }else{
        $vars[ 'singlePostMaxWidth' ] = '900px';
      }
    }else{
      $vars[ 'singlePostMaxWidth' ] = 'auto';
    }

    // COLUMNS
    // without sidebar menu left right
    $vars[ 'wosmlr_columns_992_1200' ] = $this->custom_or_default('wosmlr_columns_992_1200', 'wosmlr_columns_992_1200', 2);
    $vars[ 'wosmlr_columns_1200_1600' ] = $this->custom_or_default('wosmlr_columns_1200_1600', 'wosmlr_columns_1200_1600', 3);
    $vars[ 'wosmlr_columns_1600_1750' ] = $this->custom_or_default('wosmlr_columns_1600_1750', 'wosmlr_columns_1600_1750', 4);
    $vars[ 'wosmlr_columns_1750_5000' ] = $this->custom_or_default('wosmlr_columns_1750_5000', 'wosmlr_columns_1750_5000', 5);

    // without sidebar menu top
    $vars[ 'wosmt_columns_768_992' ] = $this->custom_or_default('wosmt_columns_768_992', 'wosmt_columns_768_992', 2);
    $vars[ 'wosmt_columns_992_1200' ] = $this->custom_or_default('wosmt_columns_992_1200', 'wosmt_columns_992_1200', 3);
    $vars[ 'wosmt_columns_1200_1300' ] = $this->custom_or_default('wosmt_columns_1200_1300', 'wosmt_columns_1200_1300', 3);
    $vars[ 'wosmt_columns_1300_1600' ] = $this->custom_or_default('wosmt_columns_1300_1600', 'wosmt_columns_1300_1600', 4);
    $vars[ 'wosmt_columns_1600_5000' ] = $this->custom_or_default('wosmt_columns_1600_5000', 'wosmt_columns_1600_5000', 5);


    // with sidebar menu left right
    $vars[ 'wsmlr_columns_992_1600' ] = $this->custom_or_default('wsmlr_columns_992_1600', 'wsmlr_columns_992_1600', 2);
    $vars[ 'wsmlr_columns_1600_1750' ] = $this->custom_or_default('wsmlr_columns_1600_1750', 'wsmlr_columns_1600_1750', 3);
    $vars[ 'wsmlr_columns_1750_5000' ] = $this->custom_or_default('wsmlr_columns_1750_5000', 'wsmlr_columns_1750_5000', 4);

    // with sidebar menu top
    $vars[ 'wsmt_columns_992_1300' ] = $this->custom_or_default('wsmt_columns_992_1300', 'wsmt_columns_992_1300', 2);
    $vars[ 'wsmt_columns_1300_1600' ] = $this->custom_or_default('wsmt_columns_1300_1600', 'wsmt_columns_1300_1600', 3);
    $vars[ 'wsmt_columns_1600_1880' ] = $this->custom_or_default('wsmt_columns_1600_1880', 'wsmt_columns_1600_1880', 4);
    $vars[ 'wsmt_columns_1880_5000' ] = $this->custom_or_default('wsmt_columns_1880_5000', 'wsmt_columns_1880_5000', 5);

    // FONTS
    $vars[ 'baseFontSize' ]              = $this->add_px($this->custom_or_default('base_font_size' , 'baseFontSize'));
    $vars[ 'headingsBaseFontSize' ]      = $this->add_px($this->custom_or_default('headings_base_font_size' , 'headingsBaseFontSize'));
    $vars[ 'mainMenuFontSize' ]          = $this->add_px($this->custom_or_default('main_menu_font_size' , 'mainMenuFontSize'));
    $vars[ 'menuLogoFontSize' ]          = $this->add_px($this->custom_or_default('logo_font_size' , 'menuLogoFontSize'));

    $vars[ 'baseFontFamily' ]            = $this->custom_or_default('text_font_family' , 'baseFontFamily');
    $vars[ 'baseFontWeight' ]            = $this->custom_or_default('text_font_weight' , 'baseFontWeight');
    $vars[ 'headingsFontFamily' ]        = $this->custom_or_default('headings_font_family' , 'headingsFontFamily');
    $vars[ 'headingsFontWeight' ]        = $this->custom_or_default('headings_font_weight' , 'headingsFontWeight');
    $vars[ 'menuFontFamily' ]            = $this->custom_or_default('menu_font_family' , 'menuFontFamily');
    $vars[ 'menuFontWeight' ]            = $this->custom_or_default('menu_links_font_weight' , 'menuFontWeight');

    // Check if "allow override of color scheme" is checked in admin
    if(get_field('enable_custom_colors', 'option') == true) {

      $vars[ 'ajaxLoaderImageName' ] = $this->custom_or_default('ajax_loader_image_name', 'ajaxLoaderImageName', 'loader-blue');
      // BODY
      $vars[ 'bodyBackgroundImage' ]            = $this->custom_or_default_image_url('body_background_image', 'bodyBackgroundImage', 'none');
      $vars[ 'bodyBackgroundColor' ]            = $this->custom_or_default('body_background_color' , 'bodyBackgroundColor');
      if(get_field('body_background_color', 'option')){
        if(get_field('body_background_style', 'option') == 'dark'){
          $vars['bodyHeadingsColor'] = $this->my_mix($vars[ 'bodyBackgroundColor' ], '#fff', 30);
          $vars['bodyTextColor'] = $this->my_mix($vars[ 'bodyBackgroundColor' ], '#fff', 50);
        }else{
          $vars['bodyHeadingsColor'] = $this->my_mix($vars[ 'bodyBackgroundColor' ], '#111', 30);
          $vars['bodyTextColor'] = $this->my_mix($vars[ 'bodyBackgroundColor' ], '#111', 50);
        }
      }

      // MENU
      $vars[ 'menuBackgroundImage' ]            = $this->custom_or_default_image_url('menu_background_image' , 'menuBackgroundImage', 'none');
      $vars[ 'menuBackgroundColor' ]            = $this->custom_or_default('menu_background_color' , 'menuBackgroundColor');
      $vars[ 'menuTopBackgroundImage' ]         = $this->custom_or_default_image_url('menu_background_image' , 'menuTopBackgroundImage', 'none');
      $vars[ 'menuTopBackgroundColor' ]         = $this->custom_or_default('menu_background_color' , 'menuTopBackgroundColor');

      if( get_field('menu_background_style', 'option') == 'light' ){
        $vars[ 'menuShadow' ]                   = '0px 0px 8px 1px rgba(0,0,0,0.1), inset 0px 0px 2px 1px #fff';
        $vars[ 'menuBorderColor' ]              = $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], -20);
        // MENU LIST
        $vars[ 'menuLinkColor' ]                = '#111';
        $vars[ 'menuLogoColor' ]                = '#111';
        $vars[ 'menuLinkColorActive' ]          = $this->my_mix($vars[ 'menuBackgroundColor' ], '#111', 30);

        // MENU SERCH
        $vars[ 'menuSearchFieldBackground' ]    = $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], 20);
        $vars[ 'menuSearchFieldBorderColor' ]   = $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], -20);
        $vars[ 'menuSearchFieldShadow' ]        = "1px 1px 2px 0px " . $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], 20) . ", inset 0px 1px 1px 0px rgba(0,0,0,0.1)";
      }else{
        $vars[ 'menuShadow' ]                   = 'none';
        $vars[ 'menuBorderColor' ]              = 'none';
        // MENU LIST
        $vars[ 'menuLinkColor' ]                = $this->my_mix($vars[ 'menuBackgroundColor' ], '#fff', 35);
        $vars[ 'menuLogoColor' ]                = $this->my_mix($vars[ 'menuBackgroundColor' ], '#fff', 15);
        $vars[ 'menuLinkColorActive' ]          = $this->my_mix($vars[ 'menuBackgroundColor' ], '#fff', 10);

        // MENU SERCH
        $vars[ 'menuSearchFieldBackground' ]    = $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], -40);
        $vars[ 'menuSearchFieldColor' ]         = '#fff';
        $vars[ 'menuSearchFieldBorderColor' ]   = $this->adjustBrightness( $vars[ 'menuBackgroundColor' ], 30);
        $vars[ 'menuSearchFieldShadow' ]        = 'none';
      }

      // MENU GRADIENT
      if( get_field('menu_background_color', 'option') ){
        $vars['menuBackgroundGradientFrom']     = $vars[ 'menuBackgroundColor' ];
        $vars['menuBackgroundGradientTo']       = $vars[ 'menuBackgroundColor' ];
        $vars['menuTopBackgroundGradientFrom']     = $vars[ 'menuBackgroundColor' ];
        $vars['menuTopBackgroundGradientTo']       = $vars[ 'menuBackgroundColor' ];
      }

      // SUB TOP BAR
      $vars[ 'subBarBackgroundColor' ]        = $this->custom_or_default('sub_bar_background_color' , 'subBarBackgroundColor');
      $vars[ 'subBarBackgroundType' ]         = $this->custom_or_default('sub_bar_background_type' , 'subBarBackgroundType');

      // HIGHLIGHT ACCENTS
      if(get_field('top_body_highlight', 'option')){
        $vars['menuTopHighlightBorder']         = '4px solid '.get_field('top_body_highlight', 'option');
        $vars['contentTopHighlightBorder']      = '4px solid '.get_field('top_body_highlight', 'option');
      }else{
        $vars['menuTopHighlightBorder']         = 'none';
        $vars['contentTopHighlightBorder']      = 'none';
      }
      $vars['highlightStrokesBackground']       = $this->custom_or_default('hightlight_accents' , 'highlightStrokesBackground');
      $vars['menuDividerBackgroundColor']       = $this->custom_or_default('hightlight_accents' , 'menuDividerBackgroundColor');


      // SIDEBAR
      $vars[ 'sidebarBackgroundImage' ]            = $this->custom_or_default_image_url('sidebar_background_image', 'sidebarBackgroundImage', 'none');
      $vars[ 'sidebarBackgroundColor' ]            = $this->custom_or_default('sidebar_background_color' , 'sidebarBackgroundColor');
      if( get_field('sidebar_background_color', 'option') ){
        $vars['sidebarBackgroundGradientFrom']     = $vars[ 'sidebarBackgroundColor' ];
        $vars['sidebarBackgroundGradientTo']       = $vars[ 'sidebarBackgroundColor' ];
        if( get_field('sidebar_background_style', 'option') == 'light' ){
          $vars[ 'sidebarShadow' ]                   = 'inset 2px 0px 3px 0px rgba(0,0,0,0.08), -1px 0px 2px 0px '.$this->adjustBrightness( $vars[ 'sidebarBackgroundColor' ], 20);
          $vars[ 'sidebarBorder' ]                   = '1px solid '.$this->adjustBrightness( $vars[ 'sidebarBackgroundColor' ], -30);
          $vars[ 'sidebarHeadingsColor' ]            = $this->my_mix($vars[ 'sidebarBackgroundColor' ], '#111', 30);
          $vars[ 'sidebarTextColor' ]                = $this->my_mix($vars[ 'sidebarBackgroundColor' ], '#111', 50);
        }else{
          $vars[ 'sidebarShadow' ]                   = 'none';
          $vars[ 'sidebarBorder' ]                   = 'none';
          $vars[ 'sidebarHeadingsColor' ]            = $this->my_mix($vars[ 'sidebarBackgroundColor' ], '#fff', 30);
          $vars[ 'sidebarTextColor' ]                = $this->my_mix($vars[ 'sidebarBackgroundColor' ], '#fff', 50);
        }
      }


      // POST
      $vars[ 'postBackground' ]                  = $this->custom_or_default('post_background', 'postBackground');
      $vars[ 'postMetaBackground' ]              = $this->custom_or_default('post_meta_background', 'postMetaBackground');
      $vars[ 'postMetaHeartBackground' ]         = $this->custom_or_default('post_meta_heart_background', 'postMetaHeartBackground');
      $vars[ 'postMetaHeartColor' ]              = $this->custom_or_default('post_meta_heart_color', 'postMetaHeartColor');
      $vars[ 'postMetaHeartColorHover' ]         = $this->custom_or_default('post_meta_heart_color_hover', 'postMetaHeartColorHover');
      $vars[ 'postTitleColor' ]                  = $this->custom_or_default('post_title_color', 'postTitleColor');
      $vars[ 'postContentColor' ]                = $this->custom_or_default('post_content_color', 'postContentColor');

      if( get_field('body_background_style', 'option') == 'light' ){
        $vars[ 'postBorder' ] = '1px solid '. $this->adjustBrightness( $vars[ 'bodyBackgroundColor' ], -40 );
      }else{
        $vars[ 'postBorder' ] = 'none';
      }
      $vars[ 'textColor' ]                      = $this->custom_or_default('text_color', 'textColor');

    }
    return $vars;
  }

  public function FunctionName($value='')
  {
      # code...
  }

  // Convert RGBA color to 6 digit HEX
  public function my_rgba_to_hex($rgba_arr){
    return "#".substr(parent::lib_rgbahex($rgba_arr), -6);
  }

  // Mix 2 colors
  public function my_mix($color1, $color2, $percent){
    return $this->my_rgba_to_hex(parent::lib_mix(array("list", ",", array( array("raw_color", $color1),  array("raw_color", $color2), array("number", $percent, "%")))));
  }


  function adjustBrightness($hex, $steps) {
    $hex = str_replace('#','',$hex);
    // Steps should be between -255 and 255. Negative = darker, positive = lighter
    $steps = max(-255, min(255, $steps));

    // Format the hex color string
    $hex = str_replace('#', '', $hex);
    if (strlen($hex) == 3) {
        $hex = str_repeat(substr($hex,0,1), 2).str_repeat(substr($hex,1,1), 2).str_repeat(substr($hex,2,1), 2);
    }

    // Get decimal values
    $r = hexdec(substr($hex,0,2));
    $g = hexdec(substr($hex,2,2));
    $b = hexdec(substr($hex,4,2));

    // Adjust number of steps and keep it inside 0 to 255
    $r = max(0,min(255,$r + $steps));
    $g = max(0,min(255,$g + $steps));
    $b = max(0,min(255,$b + $steps));

    $r_hex = str_pad(dechex($r), 2, '0', STR_PAD_LEFT);
    $g_hex = str_pad(dechex($g), 2, '0', STR_PAD_LEFT);
    $b_hex = str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
    return '#'.$r_hex.$g_hex.$b_hex;
  }

  function getContrastYIQ($hexcolor, $dark = 'black', $light = 'white'){
    $r = hexdec(substr($hexcolor,0,2));
    $g = hexdec(substr($hexcolor,2,2));
    $b = hexdec(substr($hexcolor,4,2));
    $yiq = (($r*299)+($g*587)+($b*114))/1000;
    return ($yiq >= 128) ? $dark : $light;
  }

  function add_px($value = '14')
  {
    $value = str_replace('px', '', $value);
    $value = $value.'px';
    return $value;
  }

  function custom_or_default($custom_key, $default_key, $default_value = '#aaa'){
    $option_value = get_field("{$custom_key}", 'option');
    if(!empty($option_value)){
      return $option_value;
    }else{
      if(isset($this->default_vars["{$default_key}"]))
        return $this->default_vars["{$default_key}"];
      else
        return $default_value;
    }
  }

  function custom_or_default_image_url($custom_key, $default_key, $default_value = 'none'){
    $option_value = get_field("{$custom_key}", 'option');
    if(!empty($option_value)){
      return $this->wrap_in_url($option_value);
    }else{
      if(isset($this->default_vars["{$default_key}"]))
        return $this->default_vars["{$default_key}"];
      else
        return $default_value;
    }
  }

  public function wrap_in_url($value='none')
  {
    if($value == 'none'){
      return 'none';
    }else{
      return 'url('.$value.')';
    }
  }

  function custom_merged_or_default($custom_key, $default_key, $merge_string, $default_value = "4px solid #fff"){
    $option_value = get_field("{$custom_key}", 'option');
    if(!empty($option_value)){
      return $merge_string.$option_value;
    }else{
      if(isset($this->default_vars["{$default_key}"]))
        return $this->default_vars["{$default_key}"];
      else
        return $default_value;
    }
  }

  function adjust_custom_or_use_default($custom_key, $default_key, $steps){
    $option_value = get_field("{$custom_key}", 'option');
    if(!empty($option_value)){
      return $this->adjustBrightness($option_value, $steps);
    }else{
      return $this->default_vars["{$default_key}"];
    }
  }

  function adjust_mix_custom_or_use_default($custom_key, $default_key, $steps, $mix_color, $mix_value){
    $option_value = get_field("{$custom_key}", 'option');
    if(!empty($option_value)){
      $adjusted_color = $this->adjustBrightness($option_value, $steps);
      $mixed_color = $this->my_mix($mix_color, $adjusted_color, $mix_value);
      return $mixed_color;
    }else{
      return $this->default_vars["{$default_key}"];
    }
  }

}


// Hook to the ACF and set a variable to recompile a less css if options have been saved
function my_acf_save_post( $post_id ) {
  // stop function if not "options" page
  if( $post_id != "options" ) {
    return;
  }
  // Set a flag to recompile LESS on the next front end request.
  update_option( 'prefix_force_recompile', 'yes' );
}
// run after ACF saves the $_POST['fields'] data
add_action('acf/save_post', 'my_acf_save_post', 20);

$my_less = new my_less;
// pass variables into all .less files
add_filter( 'less_vars', array($my_less, 'my_less_vars'), 10, 2 );

?>