const db = require("../config/db");
const saveCards = require("../middleware/genCards");

class ConstructorService {
    // createPack(data) {
    //     return new Promise((res, rej) => {
    //         let sql = `
    //             INSERT INTO 
    //                 house(
    //                 group_id,
    //                 title,
    //                 number,
    //                 points,
    //                 points_number,
    //                 geo,
    //                 osm_id,
    //                 settlement,
    //                 created_at
    //                 ) 
    //             VALUES 
    //                 (?, ?, ?, ?, ?, ?, ?, ?, ?)
    //         `;

    //         db.run(sql, [
    //             Number(data.house.group_id),
    //             data.house.title,
    //             data.house.number,
    //             JSON.stringify(data.house.points),
    //             JSON.stringify(data.house.points_number),
    //             JSON.stringify(data.house.geo),
    //             JSON.stringify(data.house.osm_id),
    //             data.house.settlement,
    //             Math.floor(Date.now())
    //         ], function (err) {
    //             if (err) {
    //                 console.error(err.message);
    //                 return res(false);
    //             } else if (this.changes === 0) {
    //                 return res(false);
    //             } else {
    //                 const houseId = this.lastID;

    //                 const entranceStmt = db.prepare(`
    //                     INSERT INTO 
    //                         entrance(
    //                             house_id, 
    //                             entrance_number, 
    //                             title, 
    //                             points, 
    //                             points_number, 
    //                             created_at
    //                         ) 
    //                     VALUES 
    //                         (?, ?, ?, ?, ?, ?)`);

    //                 const apartmentStmt = db.prepare(`
    //                     INSERT INTO 
    //                         apartments(
    //                             entrance_id, 
    //                             apartment_number, 
    //                             floors_number, 
    //                             updated_at
    //                         ) 
    //                     VALUES 
    //                         (?, ?, ?, ?)`);

    //                 data.entrance.forEach((e, index) => {
    //                     entranceStmt.run(
    //                         houseId,
    //                         Number(e.entrance_number),
    //                         e.title,
    //                         JSON.stringify(e.points),
    //                         JSON.stringify(e.points_number),
    //                         Math.floor(Date.now()),
    //                         function (err) {
    //                             if (err) {
    //                                 console.error(err.message);
    //                                 return;
    //                             }
    //                             const entranceId = this.lastID;

    //                             if (data.apartments[e.editor_id]) {
    //                                 data.apartments[e.editor_id].forEach(apartment => {
    //                                     apartmentStmt.run(
    //                                         entranceId,
    //                                         apartment.apartment_number,
    //                                         apartment.floors_number,
    //                                         Math.floor(Date.now())
    //                                     );
    //                                 });
    //                             }
    //                         }
    //                     );
    //                 });

    //                 entranceStmt.finalize();
    //                 apartmentStmt.finalize();

    //                 // res({ "status": "ok", "id": houseId });
    //             }
    //         });
    //     });
    // }

    // createPack(data) {
    //     return new Promise((res, rej) => {

    //         if (data.type == "house") {
    //             const sql = `
    //                 INSERT INTO house (
    //                     title, number, points, points_number, geo, osm_id, settlement, created_at
    //                 ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;

    //             db.run(sql, [
    //                 data.title,
    //                 data.number,
    //                 JSON.stringify(data.points),
    //                 JSON.stringify(data.points_number),
    //                 JSON.stringify(data.geo),
    //                 JSON.stringify(data.osm_id),
    //                 data.settlement,
    //                 Math.floor(Date.now())
    //             ], function (err) {
    //                 if (err) {
    //                     console.error(err.message);
    //                     return res(false);
    //                 }
    //                 if (this.changes === 0) {
    //                     return res(false);
    //                 }

    //                 const houseId = this.lastID;

    //                 saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 18, type: "house", number: houseId, address: `${data.title} ${data.number}` });


    //                 const entranceStmt = db.prepare(`
    //                     INSERT INTO entrance (
    //                         house_id, entrance_number, title, points, points_number, created_at
    //                     ) VALUES (?, ?, ?, ?, ?, ?)`);

    //                 const apartmentStmt = db.prepare(`
    //                     INSERT INTO apartments (
    //                         entrance_id, apartment_number, title, floors_number
    //                     ) VALUES (?, ?, ?, ?)`);

    //                 const entranceIdMap = {}; // Для сопоставления editor_id → entrance_id

    //                 let pendingEntrances = data.entrance.length;

    //                 data.entrance.forEach((e) => {
    //                     entranceStmt.run(
    //                         houseId,
    //                         Number(e.entrance_number),
    //                         e.title,
    //                         JSON.stringify(e.points),
    //                         JSON.stringify(e.points_number),
    //                         Math.floor(Date.now()),
    //                         function (err) {
    //                             if (err) {
    //                                 console.error(err.message);
    //                                 return;
    //                             }
    //                             const entranceId = this.lastID;
    //                             entranceIdMap[e.editor_id] = entranceId;

    //                             if (--pendingEntrances === 0) {
    //                                 insertApartments();
    //                             }
    //                         }
    //                     );
    //                 });

    //                 function insertApartments() {
    //                     for (const [editor_id, apartments] of Object.entries(data.apartments)) {
    //                         const entranceId = entranceIdMap[editor_id];
    //                         if (!entranceId) continue;

    //                         apartments.forEach(apartment => {
    //                             apartmentStmt.run(
    //                                 entranceId,
    //                                 Number(apartment.apartment_number),
    //                                 apartment.title,
    //                                 apartment.floors_number
    //                             );
    //                         });
    //                     }

    //                     entranceStmt.finalize();
    //                     apartmentStmt.finalize();
    //                     res({ "status": "ok", "id": houseId });
    //                 }
    //             });
    //         } else if (data.type == "homestead") {
    //             return res(false);
    //         } else {
    //             return res(false);
    //         }
    //     });
    // }

    createPack(data) {
        return new Promise((res, rej) => {

            if (data.type === "house") {
                const sql = `
                    INSERT INTO house (
                        title, number, points, points_number, geo, osm_id, settlement, created_at
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;

                db.run(sql, [
                    data.title,
                    data.number,
                    JSON.stringify(data.points),
                    JSON.stringify(data.points_number),
                    JSON.stringify(data.geo),
                    JSON.stringify(data.osm_id),
                    data.settlement,
                    Math.floor(Date.now())
                ], function (err) {
                    if (err) {
                        console.error(err.message);
                        return res(false);
                    }
                    if (this.changes === 0) {
                        return res(false);
                    }

                    const houseId = this.lastID;

                    // saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 18, type: "house", number: houseId, address: `${data.title} ${data.number}` });

                    const entranceStmt = db.prepare(`
                        INSERT INTO entrance (
                            house_id, entrance_number, title, created_at
                        ) VALUES (?, ?, ?, ?)`);

                    const apartmentStmt = db.prepare(`
                        INSERT INTO apartments (
                            entrance_id, apartment_number, title, floors_number
                        ) VALUES (?, ?, ?, ?)`);

                    let pendingEntrances = data.entrances.length;
                    const entranceIdMap = {};

                    if (pendingEntrances === 0) return finalize();

                    // Вставляем подъезды
                    data.entrances.forEach(entrance => {
                        entranceStmt.run(
                            houseId,
                            Number(entrance.entrance_number),
                            entrance.title,
                            Math.floor(Date.now()),
                            function (err) {
                                if (err) {
                                    console.error(err.message);
                                    return res(false);
                                }

                                const entranceID = this.lastID;
                                entranceIdMap[entrance.entrance_number] = entranceID;

                                // Вставляем квартиры данного подъезда
                                let pendingApartments = entrance.apartments.length;
                                if (pendingApartments === 0) {
                                    if (--pendingEntrances === 0) finalize();
                                    return;
                                }

                                entrance.apartments.forEach(apartment => {
                                    apartmentStmt.run(
                                        entranceID,
                                        Number(apartment.apartment_number),
                                        apartment.title,
                                        Number(apartment.floors_number),
                                        function (err) {
                                            if (err) console.error(err.message);

                                            if (--pendingApartments === 0) {
                                                if (--pendingEntrances === 0) finalize();
                                            }
                                        }
                                    );
                                });
                            }
                        );
                    });

                    function finalize() {
                        entranceStmt.finalize();
                        apartmentStmt.finalize();
                        res({ status: "ok", id: houseId });
                    }
                });

            } else if (data.type === "homestead") {
                const sql = `
                    INSERT INTO homestead (
                        title, number, zoom, points, geo, osm_id, settlement, created_at
                    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
                `;

                db.run(sql, [
                    data.title,
                    data.number,
                    Number(data.zoom),
                    JSON.stringify(data.points),
                    JSON.stringify(data.geo),
                    JSON.stringify(data.osm_id),
                    data.settlement,
                    Math.floor(Date.now())
                ], function (err) {
                    if (err) {
                        console.error(err.message);
                        return res(false);
                    }
                    if (this.changes === 0) {
                        return res(false);
                    }

                    const homesteadId = this.lastID;

                    // saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 17, type: "homestead", number: homesteadId, address: `${data.title} ${data.number}` });

                    const buildingStmt = db.prepare(`
                        INSERT INTO buildings (
                            homestead_id, title, geo
                        ) VALUES (?, ?, ?)
                    `);

                    let pendingBuildings = data.buildings.length;

                    if (pendingBuildings === 0) return finalize();
                    


                    data.buildings.forEach(building => {
                        buildingStmt.run(
                            homesteadId,
                            building.title,
                            JSON.stringify(building.geo),
                            function (err) {
                                if (err) {
                                    console.error(err.message);
                                    return res(false);
                                }

                                if (--pendingBuildings === 0) finalize();
                            }
                        );
                    });

                    function finalize() {
                        buildingStmt.finalize();
                        res({ status: "ok", id: homesteadId });
                    }
                });
            } else {
                return res(false);
            }
        });
    }
}

module.exports = new ConstructorService();