import commander from "../exchanger"
import { CommandType } from "../types"
import { parseCommandResponse } from "../parsers"

const connect = (): Promise<boolean> => 
    commander.send('command', parseCommandResponse, CommandType.CONTROL)

const takeOff = (): Promise<boolean> => 
    commander.send('takeoff', parseCommandResponse, CommandType.CONTROL)

const land = (): Promise<boolean> => 
    commander.send('land', parseCommandResponse, CommandType.CONTROL)

const emergency = (): Promise<boolean> => 
    commander.send('emergency', parseCommandResponse, CommandType.CONTROL)

const stop = (): Promise<boolean> => 
    commander.send('stop', parseCommandResponse, CommandType.CONTROL)

const flip = (side: "l" | "r" | "b" | "f"): Promise<boolean> => 
    commander.send(`flip ${side}`, parseCommandResponse, CommandType.CONTROL)

const up = (distance: number): Promise<boolean> => 
    commander.send(`up ${distance}`, parseCommandResponse, CommandType.CONTROL)

const down = (distance: number): Promise<boolean> => 
    commander.send(`down ${distance}`, parseCommandResponse, CommandType.CONTROL)

const left = (distance: number): Promise<boolean> => 
    commander.send(`left ${distance}`, parseCommandResponse, CommandType.CONTROL)

const right = (distance: number): Promise<boolean> => 
    commander.send(`right ${distance}`, parseCommandResponse, CommandType.CONTROL)

const front = (distance: number): Promise<boolean> => 
    commander.send(`forward ${distance}`, parseCommandResponse, CommandType.CONTROL)

const back = (distance: number): Promise<boolean> => 
    commander.send(`back ${distance}`, parseCommandResponse, CommandType.CONTROL)

const clockwise = (angle: number): Promise<boolean> => 
    commander.send(`cw ${angle}`, parseCommandResponse, CommandType.CONTROL)

const counterClockwise = (angle: number): Promise<boolean> => 
    commander.send(`ccw ${angle}`, parseCommandResponse, CommandType.CONTROL)

const go = (end: { x: number, y: number, z: number }, speed: number): Promise<boolean> => 
    commander.send(`go ${end.x} ${end.y} ${end.z} ${speed}`, parseCommandResponse, CommandType.CONTROL)

const curve = (start: { x: number, y: number, z: number }, end: { x: number, y: number, z: number }, speed: number): Promise<boolean> => 
    commander.send(`curve ${start.x} ${start.y} ${start.z} ${end.x} ${end.y} ${end.z} ${speed}`, parseCommandResponse, CommandType.CONTROL)

export const control = {
    connect,
    takeOff,
    land,
    emergency,
    stop,
    go,
    curve,
    move: { up, down, left, right, back, front },
    rotate: { clockwise, counterClockwise },
    flip: {
        left: () => flip('l'),
        right: () => flip('r'),
        back: () => flip('b'),
        front: () => flip('f'),
    }
};

export default control;
