'use strict';

const moment = require("moment");

const areaCode = {
    "360121100000": "莲塘镇",
    "360121101000": "向塘镇",
    "360121102000": "三江镇",
    "360121103000": "塘南镇",
    "360121104000": "幽兰镇",
    "360121105000": "蒋巷镇",
    "360121106000": "武阳镇",
    "360121107000": "冈上镇",
    "360121108000": "广福镇",
    "360121191000": "昌东镇",
    "360121192000": "麻丘镇",
    "360121200000": "泾口乡",
    "360121201000": "南新乡",
    "360121202000": "塔城乡",
    "360121203000": "黄马乡",
    "360121204000": "富山乡",
    "360121205000": "东新乡",
    "360121206000": "八一乡",
    "360121403000": "小蓝经济开发区",
    "360121471000": "银三角管理委员会",
    "360121501000": "五星垦殖场",
    "360121572000": "良种繁殖场",
}

async function roadState (ctx) {
    try {
        const models = ctx.fs.dc.models;
        const { userId } = ctx.fs.api;

        const roadRes = await models.Road.findAll({})
        const projectRoadRes = await models.Project.findAll({
            type: 'road',
        })

        const bridgeRes = await models.Bridge.findAll({})

        let constructionYear = []
        for (let i = 0; constructionYear.length < 4; i++) {
            constructionYear.push(moment().subtract(i, 'year').format('YYYY'))
        }
        constructionYear.reverse()

        const roadState = {
            // 在建数量
            buildingRoad: 0,
            // 已建数量
            buildedRoad: 0,
            // 桥梁数量
            bridgeCount: bridgeRes.length,
            // 涵洞数量
            culvertCount: 0,
            // 施工统计 已建
            construction: constructionYear.map(year => {
                return {
                    year,
                    count: 0,
                }
            }),
            // 施工统计 改建
            constructionRebuild: constructionYear.map(year => {
                return {
                    year,
                    count: 0,
                }
            }),
            // 乡镇统计
            townRoad: {

            },
            // 县乡村涵洞 个数
            townCulvert: {
                '县': 0,
                '乡': 0,
                '村': 0,
            },
            // 桥大小
            bridgeSize: {
                '大桥': 0,
                '中桥': 0,
                '小桥': 0,
            },
            // 类型统计
            roadType: {
                '县': 0,
                '乡': 0,
                '村': 0,
            },
            // 在建项目统计
            townProject: {

            },
            // 等级统计
            roadLevel: {

            },
            // 养护周期
            curingPeriod: {
                frequent: 0,
                season: 0,
            },
            // 绿化里程
            greenMileage: {
                '县': {
                    canBeGreen: 0,
                    isGreen: 0,
                },
                '乡': {
                    canBeGreen: 0,
                    isGreen: 0,
                },
                '村': {
                    canBeGreen: 0,
                    isGreen: 0,
                },
            }
        }

        let roadCode = new Set()

        for (let r of roadRes) {
            roadCode.add(r.routeCode)

            roadState.culvertCount += Number(r.numberOfCulverts) || 0;

            // 建成年份
            let buildYear = r.completionTime ? moment(r.completionTime).format('YYYY') : null
            // 改建年份 
            let rebuildYear = r.reconstructionTime ? moment(r.reconstructionTime).format('YYYY') : null
            let corBuildConstruction = roadState.construction.find(item => item.year === buildYear)
            if (corBuildConstruction) {
                corBuildConstruction.count += Number(r.chainageMileage) || 0
            }
            let corReBuildConstruction = roadState.constructionRebuild.find(item => item.year === rebuildYear)
            if (corReBuildConstruction) {
                corReBuildConstruction.count += Number(r.chainageMileage) || 0
            }

            let townName = areaCode[r.townshipCode] || '其他'
            if (roadState.townRoad[townName]) {
                roadState.townRoad[townName].roadCode.add(r.routeCode)
                roadState.townRoad[townName].mileage += Number(r.chainageMileage) || 0
            } else {
                roadState.townRoad[townName] = {
                    roadCode: new Set([r.routeCode]),
                    mileage: Number(r.chainageMileage) || 0,
                }
            }

            roadState.roadType[r.level] = (roadState.roadType[r.level] || 0) + (Number(r.chainageMileage) || 0)

            roadState.townCulvert[r.level] = (roadState.townCulvert[r.level] || 0) + (Number(r.numberOfCulverts) || 0)

            if (roadState.roadLevel[r.technicalLevel]) {
                roadState.roadLevel[r.technicalLevel] += 1
            } else {
                roadState.roadLevel[r.technicalLevel] = 1
            }

            if (r.curingTime) {
                if (r.curingTime.indexOf('经常') > -1) {
                    roadState.curingPeriod.frequent += 1
                } else if (r.curingTime.indexOf('季节') > -1) {
                    roadState.curingPeriod.season += 1
                }
            }

            if (r.level && roadState.greenMileage[r.level]) {
                roadState.greenMileage[r.level].canBeGreen += (Number(r.greeningMileage) || 0)
                roadState.greenMileage[r.level].isGreen += (Number(r.greeningMileaged) || 0)
            }
        }

        let corBuildConstruction2022 = roadState.construction.find(item => item.year == 2022)

        for (let p of projectRoadRes) {
            if (p.type == 'road') {

                if (corBuildConstruction2022) {
                    corBuildConstruction2022.count += Number(p.projectMileage) || 0
                }

                if (p.done) {
                    roadState.buildedRoad += 1
                } else {
                    roadState.buildingRoad += 1
                }
            }

            if (p.buildUnit) {
                let townName = p.buildUnit.replace('人民政府', '').replace('南昌县', '').replace('管委会', '')
                if (roadState.townProject[townName]) {
                    roadState.townProject[townName] += 1
                } else {
                    roadState.townProject[townName] = 1
                }

                if (p.type == 'road' && p.done) {
                    if (roadState.townRoad[townName]) {
                        if (roadState.townRoad[townName].roadCount) {
                            roadState.townRoad[townName].roadCount += 1
                        } else {
                            roadState.townRoad[townName].roadCount = roadState.townRoad[townName].roadCode.size
                            roadState.townRoad[townName].roadCount += 1
                        }
                    }
                }
            }
        }

        for (let { dataValues: b } of bridgeRes) {
            if (roadState.bridgeSize[b.bridgeClassification] || roadState.bridgeSize[b.bridgeClassification] == 0) {
                roadState.bridgeSize[b.bridgeClassification] += 1
            }
        }

        roadState.buildedRoad += roadCode.size
        for (let t of Object.keys(roadState.townRoad)) {
            if (roadState.townRoad[t].roadCount) {

            } else {
                roadState.townRoad[t].roadCount = roadState.townRoad[t].roadCode.size
            }
            delete roadState.townRoad[t].roadCode
        }

        ctx.status = 200
        ctx.body = roadState
    } catch (error) {
        ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
        ctx.status = 400;
        ctx.body = {
            message: typeof error == 'string' ? error : undefined
        }
    }
}

module.exports = {
    roadState,
};