// Type definitions for turtlejs
// Project: https://github.com/shlomil/turtlejs
// Definitions by: Shlomi Loubaton

export interface TurtleOptions {
  canvas?: HTMLCanvasElement;
  width?: number;
  height?: number;
  background?: string;
  startX?: number;
  startY?: number;
  startAngle?: number;
  speed?: number;
}

export interface ScreenOptions {
  canvas?: HTMLCanvasElement;
  width?: number;
  height?: number;
  background?: string;
}

export interface Vector {
  x: number;
  y: number;
}

export interface Font {
  family?: string;
  size?: number;
  weight?: string;
  style?: string;
}

export class Turtle {
  constructor(options?: TurtleOptions);
  
  // Movement methods
  forward(distance: number): Promise<void>;
  fd(distance: number): Promise<void>;
  backward(distance: number): Promise<void>;
  bk(distance: number): Promise<void>;
  back(distance: number): Promise<void>;
  right(angle: number): Promise<void>;
  rt(angle: number): Promise<void>;
  left(angle: number): Promise<void>;
  lt(angle: number): Promise<void>;
  goto(x: number, y: number): Promise<void>;
  setpos(x: number, y: number): Promise<void>;
  setposition(x: number, y: number): Promise<void>;
  teleport(x: number, y: number): void;
  setx(x: number): Promise<void>;
  sety(y: number): Promise<void>;
  setheading(angle: number): Promise<void>;
  seth(angle: number): Promise<void>;
  home(): Promise<void>;
  circle(radius: number, extent?: number, steps?: number): Promise<void>;
  
  // Pen control
  pendown(): void;
  pd(): void;
  down(): void;
  penup(): void;
  pu(): void;
  up(): void;
  pensize(width: number): void;
  width(width: number): void;
  pencolor(color: string | [number, number, number]): void;
  fillcolor(color: string | [number, number, number]): void;
  begin_fill(): void;
  end_fill(): Promise<void>;
  
  // State methods
  hideturtle(): void;
  ht(): void;
  showturtle(): void;
  st(): void;
  isvisible(): boolean;
  speed(speed: number): void;
  
  // Advanced methods
  write(text: string, move?: boolean, align?: string, font?: Font | string): Promise<void>;
  dot(size?: number, color?: string | [number, number, number]): Promise<void>;
  stamp(): number;
  clearstamp(stampId: number): void;
  clearstamps(n?: number): void;
  undo(): Promise<void>;
  
  // Position and state information
  position(): Vector;
  pos(): Vector;
  xcor(): number;
  ycor(): number;
  heading(): number;
  distance(x: number, y: number): number;
  towards(x: number, y: number): number;
}

export class Screen {
  constructor(options?: ScreenOptions);
  
  bgcolor(color: string | [number, number, number]): void;
  clear(): void;
  reset(): void;
  getcanvas(): HTMLCanvasElement;
  getcontext(): CanvasRenderingContext2D;
  onclick(x: number, y: number, func: (x: number, y: number) => void): void;
  onkey(func: () => void, key: string): void;
  listen(): void;
  tracer(n: number): void;
  update(): void;
  delay(ms: number): void;
  bye(): void;
  exitonclick(): void;
}

// Global functions
export function createTurtle(options?: TurtleOptions): Turtle;
export function createScreen(options?: ScreenOptions): Screen;
export function export_turtle_globals(): void;

// Global turtle functions
export function forward(distance: number): Promise<void>;
export function fd(distance: number): Promise<void>;
export function backward(distance: number): Promise<void>;
export function bk(distance: number): Promise<void>;
export function back(distance: number): Promise<void>;
export function right(angle: number): Promise<void>;
export function rt(angle: number): Promise<void>;
export function left(angle: number): Promise<void>;
export function lt(angle: number): Promise<void>;
export function goto(x: number, y: number): Promise<void>;
export function setpos(x: number, y: number): Promise<void>;
export function setposition(x: number, y: number): Promise<void>;
export function teleport(x: number, y: number): void;
export function setx(x: number): Promise<void>;
export function sety(y: number): Promise<void>;
export function setheading(angle: number): Promise<void>;
export function seth(angle: number): Promise<void>;
export function home(): Promise<void>;
export function circle(radius: number, extent?: number, steps?: number): Promise<void>;
export function pendown(): void;
export function pd(): void;
export function down(): void;
export function penup(): void;
export function pu(): void;
export function up(): void;
export function pensize(width: number): void;
export function width(width: number): void;
export function pencolor(color: string | [number, number, number]): void;
export function fillcolor(color: string | [number, number, number]): void;
export function begin_fill(): void;
export function end_fill(): Promise<void>;
export function hideturtle(): void;
export function ht(): void;
export function showturtle(): void;
export function st(): void;
export function isvisible(): boolean;
export function speed(speed: number): void;
export function write(text: string, move?: boolean, align?: string, font?: Font | string): Promise<void>;
export function dot(size?: number, color?: string | [number, number, number]): Promise<void>;
export function stamp(): number;
export function clearstamp(stampId: number): void;
export function clearstamps(n?: number): void;
export function undo(): Promise<void>;
export function position(): Vector;
export function pos(): Vector;
export function xcor(): number;
export function ycor(): number;
export function heading(): number;
export function distance(x: number, y: number): number;
export function towards(x: number, y: number): number; 