<?php

namespace App\Helpers;

use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Support\Str;

class AvatarHelper
{
	private static $colors = [
		'#1abc9c', '#2ecc71', '#3498db', '#9b59b6',
		'#34495e', '#16a085', '#27ae60', '#2980b9',
		'#8e44ad', '#2c3e50', '#f1c40f', '#e67e22',
		'#e74c3c', '#95a5a6', '#f39c12', '#d35400',
		'#c0392b', '#bdc3c7', '#7f8c8d'
	];
	
	public static function generateAvatar($name, $username, $userId)
	{
		$initial = substr($username ?: $name, 0, 1);
		$color1 = self::$colors[array_rand(self::$colors)];
		$color2 = $color1; // $color2 = self::$colors[array_rand(self::$colors)];
		$textColor = self::$colors[array_rand(self::$colors)];
		$img = Image::canvas(40, 40);
		
		for($i = 0; $i < 40; $i++) {
			$color = self::interpolateColor($color1, $color2, $i/40);
			$img->line(0, $i, 40, $i, function ($draw) use ($color) {
				$draw->color($color);
			});
			
			// Left to right
			// $img->line($i, 0, $i, 40, function ($draw) use ($color) {
			//     $draw->color($color);
			// });
			
			// Gradient diagonal
			// $img->line($i, $i, 40, 40, function ($draw) use ($color) {
			//     $draw->color($color);
			// });
		}
		
		// Shadow draw
		$img->text(strtoupper($initial), 21, 21, function($font) {
			$font->file(public_path('fonts/Roboto-Bold.ttf'));
			$font->size(15);
			$font->color('rgba(0, 0, 0, 0.3)');
			$font->align('center');
			$font->valign('middle');
		});

		// Outline draw
		$offsets = [
			[-1, -1], [0, -1], [1, -1],
			[-1,  0],          [1,  0],
			[-1,  1], [0,  1], [1,  1]
		];
		
		foreach ($offsets as $offset) {
			$img->text(strtoupper($initial), 20 + $offset[0], 20 + $offset[1], function($font) {
				$font->file(public_path('fonts/Roboto-Bold.ttf'));
				$font->size(15);
				$font->color('#ffffff');
				$font->align('center');
				$font->valign('middle');
			});
		}

		// Main text draw
		$img->text(strtoupper($initial), 20, 20, function($font) use ($textColor) {
			$font->file(public_path('fonts/Roboto-Bold.ttf'));
			$font->size(15);
			$font->color($textColor);
			$font->align('center');
			$font->valign('middle');
		});
		
		$fileName = 'avatar_' . $userId . '_' . Str::random(10) . '.png';
		$img->save(public_path('uploads/files/' . $fileName));
		
		return $fileName;
	}
	
	private static function interpolateColor($color1, $color2, $factor)
	{
		$color1 = sscanf($color1, "#%02x%02x%02x");
		$color2 = sscanf($color2, "#%02x%02x%02x");
		
		$r = $color1[0] + ($color2[0] - $color1[0]) * $factor;
		$g = $color1[1] + ($color2[1] - $color1[1]) * $factor;
		$b = $color1[2] + ($color2[2] - $color1[2]) * $factor;
		
		return sprintf("#%02x%02x%02x", $r, $g, $b);
	}
	
	private static function drawGradient($img, $color1, $color2)
	{
		$type = rand(0, 2); // 0: vertical, 1: horizontal, 2: diagonal
		for($i = 0; $i < 40; $i++) {
			$color = self::interpolateColor($color1, $color2, $i/40);
			switch($type) {
				case 0: // Vertical (top to bottom)
					$img->line(0, $i, 40, $i, function ($draw) use ($color) {
						$draw->color($color);
					});
					break;
					
				case 1: // Horizontal (left to right)
					$img->line($i, 0, $i, 40, function ($draw) use ($color) {
						$draw->color($color);
					});
					break;
				
				case 2: // Diagonal
					$img->line($i, $i, 40, 40, function ($draw) use ($color) {
						$draw->color($color);
					});
					break;
			}
		}
		
		return $img;
	}
}