import * as express from "express";
import {createServer, Server as HTTPServer} from "http";
import * as path from "path";

export class Server {
    private httpServer: HTTPServer;
    private app: express.Application;
    // private io: socketIO.Server;

    // private activeSockets: string[] = [];
    // private senders: string[] = [];

    private readonly DEFAULT_PORT = parseInt(process.env.PORT) || 5000;

    constructor() {
        this.initialize();
    }

    private initialize(): void {
        this.app = express();
        this.httpServer = createServer(this.app);
        // this.io = socketIO(this.httpServer);

        this.configureApp();
        this.configureRoutes();
        // this.handleSocketConnection();
    }

    private configureApp(): void {
        this.app.use(express.static(path.join(__dirname, "../../dist")));
    }

    private configureRoutes(): void {
        this.app.get("/", (req, res) => {
            res.sendFile("index.html");
        });
    }

    // private handleSocketConnection(): void {
    //     let webserverSocket = null;
    //     this.io.on("connection", socket => {
    //         console.log("new client", new Date());
    //         const existingSocket = this.activeSockets.find(
    //             existingSocket => existingSocket === socket.id
    //         );
    //
    //         if (!existingSocket) {
    //             this.activeSockets.push(socket.id);
    //
    //             socket.emit("update-user-list", {
    //                 users: this.activeSockets.filter(
    //                     existingSocket => existingSocket !== socket.id
    //                 )
    //             });
    //
    //             socket.broadcast.emit("update-user-list", {
    //                 users: [socket.id]
    //             });
    //         }
    //
    //         socket.on("message", (data: any) => {
    //             console.log(new Date(), data.to, data.message.type);
    //             if (data.message.type === undefined){
    //                 console.log(new Date(), data.message);
    //             }
    //             if (data.to) {
    //                 socket.to(data.to).emit("message", data);
    //             } else if (webserverSocket) {
    //                 data.from = socket.id;
    //                 webserverSocket.emit("message", data)
    //             }
    //         });
    //
    //         socket.on("set-webserver", () => {
    //             if (webserverSocket === null) {
    //                 console.log("setting webserver", new Date())
    //                 webserverSocket = socket;
    //
    //                 this.activeSockets.forEach(s => {
    //                     if (s !== socket.id){
    //                         socket.to(s).emit("ready");
    //                     }
    //                 });
    //             }
    //         })
    //
    //         if (webserverSocket){
    //             socket.emit("ready");
    //         }
    //         // socket.on("request-offer", () => {
    //         //     if (webserverSocket) {
    //         //         webserverSocket.emit("request-offer", {socket: socket.id})
    //         //     }
    //         // });
    //         //
    //         // socket.on("answer", data => {
    //         //     console.log("got answer", data.answer);
    //         //     socket.to(data.to).emit("answer", data.answer);
    //         // });
    //         //
    //         // socket.on("send-answer", data => {
    //         //     if (webserverSocket) {
    //         //         addMessage(socket.id, JSON.parse(data));
    //         //         webserverSocket.emit("send-answer", data)
    //         //     }
    //         // });
    //         //
    //         // socket.on("send-ice-candidate", data => {
    //         //     if (socket.to(data.to)){
    //         //         addMessage(socket.id, data.candidate);
    //         //         socket.to(data.to).emit("ice-candidate", data.candidate)
    //         //     }
    //         // });
    //
    //         socket.on("disconnect", () => {
    //             console.log("losing client", new Date())
    //             this.activeSockets = this.activeSockets.filter(
    //                 existingSocket => existingSocket !== socket.id
    //             );
    //             socket.broadcast.emit("remove-user", {
    //                 socketId: socket.id
    //             });
    //             if (socket === webserverSocket){
    //                 webserverSocket = null;
    //             }
    //         });
    //     });
    // }

    public listen(callback: (port: number) => void): void {
        this.httpServer.listen(this.DEFAULT_PORT, () => {
            callback(this.DEFAULT_PORT);
        });
    }
}