import { Express } from 'express';
import { constants } from 'http2';
import { ZigbeeNTHomebridgePlatform } from '../../platform';
import { ClusterName, GroupName, IEEEAddress } from '../common/types';

interface BindUnbindRequest {
  from: IEEEAddress | GroupName;
  to: IEEEAddress | GroupName;
  sourceEndpoint?: number;
  targetEndpoint?: number;
  clusters?: ClusterName[];
  skip_disable_reporting?: boolean;
}

interface BindUnbindResponse {
  data: {
    from: IEEEAddress | GroupName;
    to: IEEEAddress | GroupName;
    clusters?: ClusterName[];
    failed?: ClusterName[];
  },
  status: 'ok' | 'error';
}

export function mapBindRoutes(express: Express, platform: ZigbeeNTHomebridgePlatform): void {
  express.post<string, any, BindUnbindResponse, BindUnbindRequest>('/api/bind', async (req, res) => {
    const bindRequest = req.body;
    const bindingResult = await platform.zigBeeClient.bind(bindRequest.from, bindRequest.to, bindRequest.clusters, bindRequest.sourceEndpoint, bindRequest.targetEndpoint);
    res.status(constants.HTTP_STATUS_OK);
    res.contentType('application/json');
    const result: BindUnbindResponse = {
      data: {
        from: bindRequest.from,
        to: bindRequest.to,
        clusters: bindingResult.successfulClusters,
        failed: bindingResult.failedClusters
      },
      status: 'ok'
    }
    res.end(JSON.stringify(result));
  });

  express.post<string, any, BindUnbindResponse, BindUnbindRequest>('/api/unbind', async (req, res) => {
    const bindRequest = req.body;
    const bindingResult = await platform.zigBeeClient.unbind(bindRequest.from, bindRequest.to, bindRequest.clusters, bindRequest.sourceEndpoint, bindRequest.targetEndpoint);
    res.status(constants.HTTP_STATUS_OK);
    res.contentType('application/json');
    const result: BindUnbindResponse = {
      data: {
        from: bindRequest.from,
        to: bindRequest.to,
        clusters: bindingResult.successfulClusters,
        failed: bindingResult.failedClusters
      },
      status: 'ok'
    }
    res.end(JSON.stringify(result));
  });
}