import { createAsyncThunk } from '@reduxjs/toolkit'
import GeneralAddress from './abstracts/abstractAddress'

let endpoint_single_image = '/render/single/image/'
let endpoint_single_set = '/render/single/set/'
let endpoint_all = '/render/all/'

let endpoint_vector_single_image = '/render/vector/single/image/'
let endpoint_vector_single_set = '/render/vector/single/set/'


const __uuidv4 = () => {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
        /[xy]/g,
        (c) => {
                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
        }
    )
}

/**
 * 
 * @param {string} endpoint:
 *      examples:
 *          'image' - connect to single image ws renderer 
 *          'set' - connect to single set ws renderer
 *          'all' - connect to all ws renderer
 * 
 *          'vector/image' - connect to vector single image ws renderer
 *          'vector/set' - connerct to vector single set ws renderer
 */
const __make_address = async (endpoint) => {
    if (endpoint === 'image')
        endpoint = endpoint_single_image
    else if (endpoint === 'set')
        endpoint = endpoint_single_set
    else if (endpoint === 'all')
        endpoint = endpoint_all
    else if (endpoint === 'vector/image')
        endpoint = endpoint_vector_single_image
    else if (endpoint === 'vector/set')
        endpoint = endpoint_vector_single_set

    return GeneralAddress + endpoint
}

/**
 *  @param body:
 *      param token: token
 *      param endpoint:
 *          examples:
 *          'image' - connect to single image ws renderer 
 *          'set' - connect to single set ws renderer
 *          'all' - connect to all ws renderer
 * 
 *          'vector/image' - connect to vector single image ws renderer
 *          'vector/set' - connerct to vector single set ws renderer
 */
const fetchConnect = createAsyncThunk(
    'render/async/fetchConnect',
    async (
        body,
        thunkAPI
    ) => {
        let uuid = __uuidv4()
        let address = __make_address(body.endpoint)
        return {
            web_socket: new WebSocket(address + uuid),
            address: address,
            room_uuid: uuid
        }
    }
)

/**
 *  @param body:
 *      param token: token
 *      param message: message string
 */
const fetchSaveMessage = createAsyncThunk(
    'render/async/fetchSaveMessage',
    async (
        body,
        thunkAPI
    ) => {
        return {
            message: body
        }
    }
)

/**
 *  @param body:
 *      param token: token
 */
const fetchDisconnect = createAsyncThunk(
    'render/async/fetchDisconnect',
    async (
        token,
        thunkAPI
    ) => {
        return {
            web_socket: null,
        }
    }
)

export default {
    fetchConnect,
    fetchSaveMessage,
    fetchDisconnect
}