package uk.ac.ic.wlgitbridge.snapshot.servermock.response;

import uk.ac.ic.wlgitbridge.snapshot.servermock.exception
        .InvalidAPICallException;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.getdoc
        .SnapshotGetDocResponse;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.getforver
        .SnapshotGetForVerResponse;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.getsavedver
        .SnapshotGetSavedVersResponse;
import uk.ac.ic.wlgitbridge.snapshot.servermock.response.push
        .SnapshotPushResponse;
import uk.ac.ic.wlgitbridge.snapshot.servermock.state.SnapshotAPIState;

/**
 * Created by Winston on 09/01/15.
 */
public class SnapshotResponseBuilder {

    private SnapshotAPIState state;

    public SnapshotResponse buildWithTarget(
            String target,
            String method
    ) throws InvalidAPICallException {
        checkPrefix(target);
        return parseTarget(target, target.split("/"), method);
    }

    private void checkPrefix(String target) throws InvalidAPICallException {
        if (!target.startsWith("/api/v0/docs/")) {
            throw new InvalidAPICallException(target);
        }
    }

    private SnapshotResponse parseTarget(
            String target,
            String[] parts,
            String method
    ) throws InvalidAPICallException {
        String projectName = parts[4];
        if (parts.length == 5) {
            if (method.equals("GET")) {
                return new SnapshotGetDocResponse(
                        state.getStateForGetDoc(projectName)
                );
            }
        } else if (parts.length == 6) {
            String type = parts[5];
            if (type.equals("snapshots") && method.equals("POST")) {
                return new SnapshotPushResponse(
                        state.getStateForPush(projectName),
                        state.getStateForPostback(projectName)
                );
            } else if (type.equals("saved_vers") && method.equals("GET")) {
                return new SnapshotGetSavedVersResponse(
                        state.getStateForGetSavedVers(projectName)
                );
            }
        } else if (parts.length == 7) {
            if (parts[5].equals("snapshots") && method.equals("GET")) {
                try {
                    return new SnapshotGetForVerResponse(
                            state.getStateForGetForVers(
                                    projectName, Integer.parseInt(parts[6])
                            )
                    );
                } catch (NumberFormatException e) {

                }
            }
        }
        throw new InvalidAPICallException(target);
    }

    public void setState(SnapshotAPIState state) {
        this.state = state;
    }

}
