<?php 

namespace App\Classes;

class ColorConverterClass {
    // Sample color names mapping
    protected static $colorNames = [
      'aliceblue'            =>'#F0F8FF',
      'antiquewhite'         =>'#FAEBD7',
      'aqua'                 =>'#00FFFF',
      'aquamarine'           =>'#7FFFD4',
      'azure'                =>'#F0FFFF',
      'beige'                =>'#F5F5DC',
      'bisque'               =>'#FFE4C4',
      'black'                =>'#000000',
      'blanchedalmond '      =>'#FFEBCD',
      'blue'                 =>'#0000FF',
      'blueviolet'           =>'#8A2BE2',
      'brown'                =>'#A52A2A',
      'burlywood'            =>'#DEB887',
      'cadetblue'            =>'#5F9EA0',
      'chartreuse'           =>'#7FFF00',
      'chocolate'            =>'#D2691E',
      'coral'                =>'#FF7F50',
      'cornflowerblue'       =>'#6495ED',
      'cornsilk'             =>'#FFF8DC',
      'crimson'              =>'#DC143C',
      'cyan'                 =>'#00FFFF',
      'darkblue'             =>'#00008B',
      'darkcyan'             =>'#008B8B',
      'darkgoldenrod'        =>'#B8860B',
      'darkgray'             =>'#A9A9A9',
      'darkgreen'            =>'#006400',
      'darkgrey'             =>'#A9A9A9',
      'darkkhaki'            =>'#BDB76B',
      'darkmagenta'          =>'#8B008B',
      'darkolivegreen'       =>'#556B2F',
      'darkorange'           =>'#FF8C00',
      'darkorchid'           =>'#9932CC',
      'darkred'              =>'#8B0000',
      'darksalmon'           =>'#E9967A',
      'darkseagreen'         =>'#8FBC8F',
      'darkslateblue'        =>'#483D8B',
      'darkslategray'        =>'#2F4F4F',
      'darkslategrey'        =>'#2F4F4F',
      'darkturquoise'        =>'#00CED1',
      'darkviolet'           =>'#9400D3',
      'deeppink'             =>'#FF1493',
      'deepskyblue'          =>'#00BFFF',
      'dimgray'              =>'#696969',
      'dimgrey'              =>'#696969',
      'dodgerblue'           =>'#1E90FF',
      'firebrick'            =>'#B22222',
      'floralwhite'          =>'#FFFAF0',
      'forestgreen'          =>'#228B22',
      'fuchsia'              =>'#FF00FF',
      'gainsboro'            =>'#DCDCDC',
      'ghostwhite'           =>'#F8F8FF',
      'gold'                 =>'#FFD700',
      'goldenrod'            =>'#DAA520',
      'gray'                 =>'#808080',
      'green'                =>'#008000',
      'greenyellow'          =>'#ADFF2F',
      'grey'                 =>'#808080',
      'honeydew'             =>'#F0FFF0',
      'hotpink'              =>'#FF69B4',
      'indianred'            =>'#CD5C5C',
      'indigo'               =>'#4B0082',
      'ivory'                =>'#FFFFF0',
      'khaki'                =>'#F0E68C',
      'lavender'             =>'#E6E6FA',
      'lavenderblush'        =>'#FFF0F5',
      'lawngreen'            =>'#7CFC00',
      'lemonchiffon'         =>'#FFFACD',
      'lightblue'            =>'#ADD8E6',
      'lightcoral'           =>'#F08080',
      'lightcyan'            =>'#E0FFFF',
      'lightgoldenrodyellow' =>'#FAFAD2',
      'lightgray'            =>'#D3D3D3',
      'lightgreen'           =>'#90EE90',
      'lightgrey'            =>'#D3D3D3',
      'lightpink'            =>'#FFB6C1',
      'lightsalmon'          =>'#FFA07A',
      'lightseagreen'        =>'#20B2AA',
      'lightskyblue'         =>'#87CEFA',
      'lightslategray'       =>'#778899',
      'lightslategrey'       =>'#778899',
      'lightsteelblue'       =>'#B0C4DE',
      'lightyellow'          =>'#FFFFE0',
      'lime'                 =>'#00FF00',
      'limegreen'            =>'#32CD32',
      'linen'                =>'#FAF0E6',
      'magenta'              =>'#FF00FF',
      'maroon'               =>'#800000',
      'mediumaquamarine'     =>'#66CDAA',
      'mediumblue'           =>'#0000CD',
      'mediumorchid'         =>'#BA55D3',
      'mediumpurple'         =>'#9370D0',
      'mediumseagreen'       =>'#3CB371',
      'mediumslateblue'      =>'#7B68EE',
      'mediumspringgreen'    =>'#00FA9A',
      'mediumturquoise'      =>'#48D1CC',
      'mediumvioletred'      =>'#C71585',
      'midnightblue'         =>'#191970',
      'mintcream'            =>'#F5FFFA',
      'mistyrose'            =>'#FFE4E1',
      'moccasin'             =>'#FFE4B5',
      'navajowhite'          =>'#FFDEAD',
      'navy'                 =>'#000080',
      'oldlace'              =>'#FDF5E6',
      'olive'                =>'#808000',
      'olivedrab'            =>'#6B8E23',
      'orange'               =>'#FFA500',
      'orangered'            =>'#FF4500',
      'orchid'               =>'#DA70D6',
      'palegoldenrod'        =>'#EEE8AA',
      'palegreen'            =>'#98FB98',
      'paleturquoise'        =>'#AFEEEE',
      'palevioletred'        =>'#DB7093',
      'papayawhip'           =>'#FFEFD5',
      'peachpuff'            =>'#FFDAB9',
      'peru'                 =>'#CD853F',
      'pink'                 =>'#FFC0CB',
      'plum'                 =>'#DDA0DD',
      'powderblue'           =>'#B0E0E6',
      'purple'               =>'#800080',
      'red'                  =>'#FF0000',
      'rosybrown'            =>'#BC8F8F',
      'royalblue'            =>'#4169E1',
      'saddlebrown'          =>'#8B4513',
      'salmon'               =>'#FA8072',
      'sandybrown'           =>'#F4A460',
      'seagreen'             =>'#2E8B57',
      'seashell'             =>'#FFF5EE',
      'sienna'               =>'#A0522D',
      'silver'               =>'#C0C0C0',
      'skyblue'              =>'#87CEEB',
      'slateblue'            =>'#6A5ACD',
      'slategray'            =>'#708090',
      'slategrey'            =>'#708090',
      'snow'                 =>'#FFFAFA',
      'springgreen'          =>'#00FF7F',
      'steelblue'            =>'#4682B4',
      'tan'                  =>'#D2B48C',
      'teal'                 =>'#008080',
      'thistle'              =>'#D8BFD8',
      'tomato'               =>'#FF6347',
      'turquoise'            =>'#40E0D0',
      'violet'               =>'#EE82EE',
      'wheat'                =>'#F5DEB3',
      'white'                =>'#FFFFFF',
      'whitesmoke'           =>'#F5F5F5',
      'yellow'               =>'#FFFF00',
      'yellowgreen'          =>'#9ACD32'
    ];

    public static function get_data($input) {
        // Step 1: Detect the format of the input
        $rgb = self::detectAndConvertToRGB($input);
        if ($rgb === false) {
            throw new Exception("Invalid color format");
        }

        // Step 2: Convert RGB to all other formats
        $hex = RGB::toHex($rgb[0], $rgb[1], $rgb[2]);
        $hsl = RGB::toHSL($rgb[0], $rgb[1], $rgb[2]);
        $hwb = RGB::toHWB($rgb[0], $rgb[1], $rgb[2]);
        $cmyk = RGB::toCMYK($rgb[0], $rgb[1], $rgb[2]);
        $name = self::rgbToColorName($rgb);

        // Step 3: Return the results
        return [
            'name' => $name,
            'hex'  => $hex,
            'rgb'  => $rgb,
            'hsl'  => $hsl,
            'hwb'  => $hwb,
            'cmyk' => $cmyk
        ];
    }

    protected static function detectAndConvertToRGB($input) {
        // Check if the input is a color name
        if (is_string($input) && isset(self::$colorNames[strtolower($input)])) {
            $hex = self::$colorNames[strtolower($input)];
            return HEX::toRGB($hex);
        }

        // Check if the input is a hex value
        if (is_string($input) && preg_match('/^#([a-f0-9]{3}){1,2}$/i', $input)) {
            return HEX::toRGB($input);
        }

        // Check if the input is RGB
        if (is_array($input) && count($input) == 3) {
            return $input;
        }
        if (is_string($input) && preg_match('/rgb\((\d+),\s*(\d+),\s*(\d+)\)/', $input, $matches)) {
            return [(int)$matches[1], (int)$matches[2], (int)$matches[3]];
        }

        // Check if the input is HSL
        if (is_string($input) && preg_match('/hsl\((\d+),\s*(\d+)%,\s*(\d+)%\)/', $input, $matches)) {
            return HSL::toRGB((int)$matches[1], (int)$matches[2], (int)$matches[3]);
        }
        if (is_array($input) && count($input) == 3) {
            return HSL::toRGB($input[0], $input[1], $input[2]);
        }

        // Check if the input is HWB
        if (is_array($input) && count($input) == 3) {
            return HWB::toRGB($input[0], $input[1], $input[2]);
        }

        // Check if the input is CMYK
        if (is_array($input) && count($input) == 4) {
            return CMYK::toRGB($input[0], $input[1], $input[2], $input[3]);
        }

        // If none of the formats match, return false
        return false;
    }

    protected static function rgbToColorName($rgb) {
        foreach (self::$colorNames as $name => $hex) {
            if (HEX::toRGB($hex) === $rgb) {
                return ucfirst($name);
            }
        }
        return 'Unknown'; // If no match is found
    }
}

class RGB {
    public static function toHex($r, $g, $b) {
        return sprintf("#%02x%02x%02x", $r, $g, $b);
    }

    public static function toHSL($r, $g, $b) {
        $r /= 255; $g /= 255; $b /= 255;
        $max = max($r, $g, $b);
        $min = min($r, $g, $b);
        $h; $s; $l = ($max + $min) / 2;

        if ($max == $min) {
            $h = $s = 0;
        } else {
            $diff = $max - $min;
            $s = $l > 0.5 ? $diff / (2 - $max - $min) : $diff / ($max + $min);
            switch ($max) {
                case $r: $h = ($g - $b) / $diff + ($g < $b ? 6 : 0); break;
                case $g: $h = ($b - $r) / $diff + 2; break;
                case $b: $h = ($r - $g) / $diff + 4; break;
            }
            $h /= 6;
        }
        return [round($h * 360), round($s * 100), round($l * 100)];
    }

    public static function toHWB($r, $g, $b) {
        $hsl = self::toHSL($r, $g, $b);
        $whiteness = min($r, $g, $b) / 255;
        $blackness = 1 - max($r, $g, $b) / 255;
        return [$hsl[0], round($whiteness * 100), round($blackness * 100)];
    }

    public static function toCMYK($r, $g, $b) {
        $r /= 255; $g /= 255; $b /= 255;
        $k = 1 - max($r, $g, $b);
        if ($k < 1) {
            $c = (1 - $r - $k) / (1 - $k);
            $m = (1 - $g - $k) / (1 - $k);
            $y = (1 - $b - $k) / (1 - $k);
        } else {
            $c = $m = $y = 0;
        }
        return [round($c * 100), round($m * 100), round($y * 100), round($k * 100)];
    }
}

class HEX {
    public static function toRGB($hex) {
        $hex = str_replace("#", "", $hex);
        if (strlen($hex) == 3) {
            $r = hexdec(str_repeat(substr($hex, 0, 1), 2));
            $g = hexdec(str_repeat(substr($hex, 1, 1), 2));
            $b = hexdec(str_repeat(substr($hex, 2, 1), 2));
        } else {
            $r = hexdec(substr($hex, 0, 2));
            $g = hexdec(substr($hex, 2, 2));
            $b = hexdec(substr($hex, 4, 2));
        }
        return [$r, $g, $b];
    }
}
