<?php

namespace XoopsModules\Extcal;

/**
 * Class ColorTools.
 */
class ColorTools
{
    public function __construct()
    {
    }

    /**************************************************************
     * Ajoute ou rtir un icrement sur chaque compsante RGB d'une couleur
     * Les valeur sont limiter au bornes inférieure et supérieure 0 et 255
     **************************************************************
     *
     * @param     $colorHexa
     * @param     $incrementRouge
     * @param     $incrementVert
     * @param     $incrementBleu
     * @param int $plancherRouge
     * @param int $plafondRouge
     * @param int $plancherVert
     * @param int $plafondVert
     * @param int $plancherBleu
     * @param int $plafondBleu
     *
     * @return string
     */
    public function modifierCouleur(
        $colorHexa,
        $incrementRouge,
        $incrementVert,
        $incrementBleu,
        $plancherRouge = 0,
        $plafondRouge = 255,
        $plancherVert = 0,
        $plafondVert = 255,
        $plancherBleu = 0,
        $plafondBleu = 255
    ) {
        $t10 = static::hexa2rgbA($colorHexa);

        $t10[1] = static::bornerValeur($t10[1] + $incrementRouge, $plancherRouge, $plafondRouge);
        $t10[2] = static::bornerValeur($t10[2] + $incrementVert, $plancherVert, $plafondVert);
        $t10[3] = static::bornerValeur($t10[3] + $incrementBleu, $plancherBleu, $plafondBleu);

        $newColorHexa = static::getHexaColorFromA($t10);

        return $newColorHexa;
    }

    /**************************************************************
     * Eclairci une couleur
     * elle borné pa un plancher et un plafond pur évite le tout blanc ou tout blanc
     * ou les blocage sur une couleur pur (ex #FF0000)
     **************************************************************
     * @param     $colorHexa
     * @param int $plancher
     * @param int $plafond
     * @return string
     */
    public static function eclaircir($colorHexa, $plancher = 0, $plafond = 255)
    {
        $tMin = ['', $plancher, $plancher, $plancher];
        $tMax = ['', $plafond, $plafond, $plafond];

        $t10 = static::hexa2rgbA($colorHexa);
        // echo "<hr>";
        // Extcal\Utility::echoArray($t10);
        $max = $plancher;
        for ($h = 1; $h <= 3; ++$h) {
            if ($max < $t10[$h]) {
                $max = $t10[$h];
            }
        }

        $increment = $plafond - $max;

        //     $t10[1] = $t10[1] + $increment;
        //     $t10[2] = $t10[2] + $increment;
        //     $t10[3] = $t10[3] + $increment;

        $min = 0;
        for ($h = 1; $h <= 3; ++$h) {
            $t10[$h] += $increment;
            if ($t10[$h] < $tMin[$h] && $min < ($tMin[$h] - $t10[$h])) {
                $min = ($tMin[$h] - $t10[$h]);
            }
        }

        // echo "{$colorHexa}-{$plancher}-{$plafond}<br>";
        // echo "{$min}-{$max}-{$increment}<br>";

        $t10[1] = static::bornerValeur($t10[1] + $min, $plancher, $plafond);
        $t10[2] = static::bornerValeur($t10[2] + $min, $plancher, $plafond);
        $t10[3] = static::bornerValeur($t10[3] + $min, $plancher, $plafond);

        // Extcal\Utility::echoArray($t10);

        $newColorHexa = static::getHexaColorFromA($t10);

        // echo "colorHexa = {$newColorHexa}-{$colorHexa}<br>";
        return $newColorHexa;
    }

    /**************************************************************
     * Fonce une couleur
     * elle borné pa un plancher et un plafond pur évite le tout blanc ou tout blanc
     * ou les blocage sur une couleur pur (ex #FFFF00)
     **************************************************************
     * @param     $colorHexa
     * @param int $plancher
     * @param int $plafond
     * @return string
     */
    public function foncer($colorHexa, $plancher = 0, $plafond = 255)
    {
        $tMin = ['', $plancher, $plancher, $plancher];
        $tMax = ['', $plafond, $plafond, $plafond];

        $t10 = static::hexa2rgbA($colorHexa);
        $max = 255;

        for ($h = 1; $h <= 3; ++$h) {
            if ($max > $t10[$h]) {
                $max = $t10[$h];
            }
        }

        $increment = -$max;

        //     $t10[1] = $t10[1] + $increment;
        //     $t10[2] = $t10[2] + $increment;
        //     $t10[3] = $t10[3] + $increment;

        $min = 0;
        for ($h = 1; $h <= 3; ++$h) {
            $t10[$h] += $increment;
            if ($t10[$h] > $tMax[$h] && $min < ($t10[$h] - $tMax[$h])) {
                $min = ($t10[$h] - $tMax[$h]);
            }
        }

        $t10[1] = static::bornerValeur($t10[1] - $min, $plancher, $plafond);
        $t10[2] = static::bornerValeur($t10[2] - $min, $plancher, $plafond);
        $t10[2] = static::bornerValeur($t10[3] - $min, $plancher, $plafond);

        $colorHexa = static::getHexaColorFromA($t10);

        return $colorHexa;
    }

    /**************************************************************
     * Renvoi une couleur RGB en hexa a partir du tableau passe en parametr
     * Description du tableau
     * 0 = doit contenir '#' ou ''
     * 1 = int red
     * 2 = int vert
     * 3 = int bleu
     **************************************************************
     * @param $aColors
     * @return string
     */
    public static function getHexaColorFromA($aColors)
    {
        $tHex = ['', '', '', ''];

        $tHex[0] = $aColors[0];
        $tHex[1] = mb_substr('00' . \dechex($aColors[1]), -2);
        $tHex[2] = mb_substr('00' . \dechex($aColors[2]), -2);
        $tHex[3] = mb_substr('00' . \dechex($aColors[3]), -2);

        $colorHexa = \implode('', $tHex);

        return $colorHexa;
    }

    /**************************************************************
     * Transforme les composante d'une couleur en valeu hexa
     * prefixe doit contenir '#'  ou ''
     **************************************************************
     * @param        $r
     * @param        $g
     * @param        $b
     * @param string $prefixe
     * @return string
     */
    public function rgb2hexa($r, $g, $b, $prefixe = '')
    {
        $colorHexa = static::getHexaColorFromA([$prefixe, $r, $g, $b]);

        return $colorHexa;
    }

    /**************************************************************
     * renvoi un tableau d'entier des valeur rgbd d'une couleur a partir d'un hexa
     * Description du tableau renvoyé
     * 0 = contient '#' ou ''  (selon premier cactere de la couleur hexa)
     * 1 = int red
     * 2 = int vert
     * 3 = int bleu
     **************************************************************
     * @param $colorHexa
     * @return array
     */
    public static function hexa2rgbA($colorHexa)
    {
        $t = ['', '', '', ''];

        if (0 === mb_strpos($colorHexa, '#')) {
            $t[0]      = '#';
            $offsetCar = 1;
        } else {
            $t[0]      = '';
            $offsetCar = 0;
        }

        $t[1] = \hexdec(mb_substr($colorHexa, $offsetCar + 0, 2));
        $t[2] = \hexdec(mb_substr($colorHexa, $offsetCar + 2, 2));
        $t[3] = \hexdec(mb_substr($colorHexa, $offsetCar + 4, 2));

        return $t;
    }

    /**************************************************************
     * Renvoi les composante rgb d'une couleur par référence
     **************************************************************
     * @param $colorHexa
     * @param $r
     * @param $v
     * @param $b
     * @param $diese
     * @return bool
     */
    public function hexa2rgb($colorHexa, &$r, &$v, &$b, &$diese)
    {
        $t     = static::hexa2rgbA($colorHexa);
        $r     = $t[1];
        $v     = $t[2];
        $v     = $t[3];
        $diese = $t[0];

        return true;
    }

    /**************************************************************
     * Borne les valeurs max et min d'une valeur
     **************************************************************
     * @param $val
     * @param $min
     * @param $max
     * @return mixed
     */
    public static function bornerValeur($val, $min, $max)
    {
        if ($val < $min) {
            $val = $min;
        } elseif ($val > $max) {
            $val = $max;
        }

        return $val;
    }

    //--------------------------------------------------------
} // --- fin de la classe colors
//--------------------------------------------------------
