import PromiseRouter from "express-promise-router";
import { serialize} from "serializr";

import ApiError from "@common/ApiError";
import { ErrorCode } from "@common/ErrorCode";
import * as schema from "@common/sprinklersRpc/schema";
import { AccessToken } from "@common/TokenClaims";
import { verifyAuthorization } from "@server/express/authentication";
import { ServerState } from "@server/state";

export function devices(state: ServerState) {
    const router = PromiseRouter();

    router.get("/:deviceId", verifyAuthorization(), async (req, res) => {
        const token = req.token!;
        const userId = token.aud;
        const deviceId = req.params.deviceId;
        const userDevice = await state.database.sprinklersDevices
            .findUserDevice(userId, deviceId);
        if (!userDevice)  {
            throw new ApiError("User does not have access to the specified device", ErrorCode.NoPermission);
        }
        const device = state.mqttClient.getDevice(req.params.deviceId);
        const j = serialize(schema.sprinklersDevice, device);
        res.send(j);
    });

    router.post("/register", verifyAuthorization({
        type: "device_reg",
    }), async (req, res) => {
        // TODO: Implement device registration
    });

    return router;
}