/* eslint-disable no-magic-numbers */
import { num_to_hex } from '@sapphirecode/encoding-helper';

export class Color {
  public static readonly black = new Color (0, 0, 0);
  public static readonly red = new Color (255, 0, 0);
  public static readonly green = new Color (0, 255, 0);
  public static readonly yellow = new Color (255, 255, 0);
  public static readonly blue = new Color (0, 0, 255);
  public static readonly magenta = new Color (255, 0, 255);
  public static readonly cyan = new Color (0, 255, 255);
  public static readonly white = new Color (255, 255, 255);
  public static readonly transparent = new Color (0, 0, 0, 0);
  public static readonly gray = new Color (128, 128, 128);

  private _red: number;
  private _green: number;
  private _blue: number;
  private _alpha: number;

  private check_range (n: number): void {
    if (n < 0 || n > 255)
      throw new Error ('number out of range');
  }

  public constructor (red: number, green: number, blue: number, alpha = 255) {
    this.check_range (red);
    this.check_range (green);
    this.check_range (blue);
    this.check_range (alpha);
    this._red = red;
    this._green = green;
    this._blue = blue;
    this._alpha = alpha;
  }

  // eslint-disable-next-line @typescript-eslint/naming-convention
  public toString (): string {
    return `#${num_to_hex (
      this._red,
      2
    )}${num_to_hex (
      this._green,
      2
    )}${num_to_hex (
      this._blue,
      2
    )}${this._alpha === 255
      ? ''
      : num_to_hex (this._alpha, 2)}`;
  }
}