import { Client } from 'visions-client'

export type AuthState =
    | { type: 'unauthed' }
    | { type: 'authed'; sessionId: string }

export type State = {
    auth: AuthState
}

export const initialState = (): State => ({
    auth: { type: 'unauthed' },
})

export const sessionId = (state: State): string | undefined => {
    if (state.auth.type === 'authed') {
        return state.auth.sessionId
    } else {
        return undefined
    }
}

export type Action = { type: 'set-auth'; content: AuthState }

export const reducer = (state: State, action: Action) => {
    switch (action.type) {
        case 'set-auth': {
            return { ...state, auth: action.content }
        }
        default: {
            return state
        }
    }
}

export class Controller {
    client: Client
    state: State

    constructor(
        client: Client,
        state: State,
    ) {
        this.client = client
        this.state = state
    }

    // On any request, there are four options.
    // The request succeeds. No problem.
    // The request succeeds, but the user needs to reset their password.
    // The action fails.
    // The HTTP request itself fails.
    async auth(username: string, password: string) {
        let response = await this.client.auth(username, password)
        switch (response.status) {
            case 'ok': {
                /*
                this.dispatch({
                    type: 'set-auth',
                    content: {
                        type: 'authed',
                        sessionId: response.content.content,
                    },
                })
                */
                return
            }
        }
    }
}