importPackage(java.awt);
importPackage(java.awt.geom);
include(Resources.id('mtrsteamloco:scripts/display_helper.js'));

let slotHeadDestCfg = {								// ЭМУ ОСНОВНОЙ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'head-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-0.6401, 2.1641, 10.2903],		// Левый Верхний Угол XYZ
                    [-0.6401, 1.9655, 10.2903],	// Левый Нижний Угол XYZ
                    [0.6401, 1.9655, 10.2903],		// Правый Нижний Угол XYZ
                    [0.6401, 2.1641, 10.2903],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46453, 1.81742, 5.90477],		// Левый Верхний Угол XYZ
                    [-1.46453, 1.589, 5.90477],	// Левый Нижний Угол XYZ
                    [-1.46453, 1.58531, 7.18519],		// Правый Нижний Угол XYZ
                    [-1.46453, 1.82303, 7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46189, 1.82303, 7.18519],		// Левый Верхний Угол XYZ
                    [1.4642, 1.58531, 7.18519],	// Левый Нижний Угол XYZ
                    [1.46418, 1.589, 5.90477],		// Правый Нижний Угол XYZ
                    [1.46193, 1.81742, 5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotWagCfg = {								// ЭМУ НА ВТОРОЙ ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'wag-left-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46236, 1.82303, 8.33304],		// Левый Верхний Угол XYZ
                    [-1.46467, 1.5853, 8.33304],	// Левый Нижний Угол XYZ
                    [-1.46465, 1.589, 9.61346],		// Правый Нижний Угол XYZ
                    [-1.4624, 1.81742, 9.61347],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-left-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.4644, 1.81742, -9.71838],		// Левый Верхний Угол XYZ
                    [-1.46539, 1.589, -9.71837],	// Левый Нижний Угол XYZ
                    [-1.46667, 1.5853, -8.43795],		// Правый Нижний Угол XYZ
                    [-1.46289, 1.82303, -8.43795],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-right-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46201, 1.81742, 9.61347],		// Левый Верхний Угол XYZ
                    [1.46425, 1.589, 9.61346],	// Левый Нижний Угол XYZ
                    [1.46428, 1.5853, 8.33304],		// Правый Нижний Угол XYZ
                    [1.46196, 1.82303, 8.33304],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-right-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46229, 1.82303, -8.43795],		// Левый Верхний Угол XYZ
                    [1.46461, 1.5853, -8.43795],	// Левый Нижний Угол XYZ
                    [1.46458, 1.589, -9.71837],		// Правый Нижний Угол XYZ
                    [1.46234, 1.81742, -9.71838],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotWag2Cfg = {								// ЭМУ НА ВТОРОЙ ВАГОН (пришлось разделить на два, т.к он при рендере на втором составе ломал игру)
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'wag-left-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46236, 1.82303, 8.33304],		// Левый Верхний Угол XYZ
                    [-1.46467, 1.5853, 8.33304],	// Левый Нижний Угол XYZ
                    [-1.46465, 1.589, 9.61346],		// Правый Нижний Угол XYZ
                    [-1.4624, 1.81742, 9.61347],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-left-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.4644, 1.81742, -9.71838],		// Левый Верхний Угол XYZ
                    [-1.46539, 1.589, -9.71837],	// Левый Нижний Угол XYZ
                    [-1.46667, 1.5853, -8.43795],		// Правый Нижний Угол XYZ
                    [-1.46289, 1.82303, -8.43795],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-right-dest1',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46201, 1.81742, 9.61347],		// Левый Верхний Угол XYZ
                    [1.46425, 1.589, 9.61346],	// Левый Нижний Угол XYZ
                    [1.46428, 1.5853, 8.33304],		// Правый Нижний Угол XYZ
                    [1.46196, 1.82303, 8.33304],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'wag-right-dest2',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46229, 1.82303, -8.43795],		// Левый Верхний Угол XYZ
                    [1.46461, 1.5853, -8.43795],	// Левый Нижний Угол XYZ
                    [1.46458, 1.589, -9.71837],		// Правый Нижний Угол XYZ
                    [1.46234, 1.81742, -9.71838],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotPromCfg = {								// ЭМУ НА ГОЛОВУ СЦЕПКИ
    version: 1,
    texSize: [1024, 128],
    slots: [

        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46215, 1.82303, -7.18519],		// Левый Верхний Угол XYZ
                    [-1.46446, 1.58531, -7.18519],	// Левый Нижний Угол XYZ
                    [-1.46444, 1.589, -5.90477],		// Правый Нижний Угол XYZ
                    [-1.46219, 1.81742, -5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46219, 1.81742, -5.90477],		// Левый Верхний Угол XYZ
                    [1.46443, 1.589, -5.90477],	// Левый Нижний Угол XYZ
                    [1.46446, 1.58531, -7.18519],		// Правый Нижний Угол XYZ
                    [1.46214, 1.82303, -7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotProm2Cfg = {								// ЭМУ НА ГОЛОВУ СЦЕПКИ
    version: 1,
    texSize: [1024, 128],
    slots: [

        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46215, 1.82303, 7.18519],		// Левый Верхний Угол XYZ
                    [1.46446, 1.58531, 7.18519],	// Левый Нижний Угол XYZ
                    [1.46444, 1.589, 5.90477],		// Правый Нижний Угол XYZ
                    [1.46219, 1.81742, 5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46219, 1.81742, 5.90477],		// Левый Верхний Угол XYZ
                    [-1.46443, 1.589, 5.90477],	// Левый Нижний Угол XYZ
                    [-1.46446, 1.58531, 7.18519],		// Правый Нижний Угол XYZ
                    [-1.46214, 1.82303, 7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};



let slotHeadRouteCfg = {							// ЭМУ МАРШРУТ ГОЛОВНОЙ (БЕЛЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'head-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0, 0, 0],		// Левый Верхний Угол XYZ
                    [0, 0, 0],		// Левый Нижний Угол XYZ
                    [0, 0, 0],	    // Правый Нижний Угол XYZ
                    [0, 0, 0],	    // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailDestCfg = {							    // ЭМУ ОСНОВНОЙ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [1024, 128],
    slots: [
        {
            name: 'tail-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [0.6401, 2.1641, -10.2903],     // Левый Верхний Угол XYZ
                    [0.6401, 1.9655, -10.2903], // Левый Нижний Угол XYZ
                    [-0.6401, 1.9655, -10.2903],      // Правый Нижний Угол XYZ
                    [-0.6401, 2.1641, -10.2903],      // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-left-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [-1.46215, 1.82303, -7.18519],		// Левый Верхний Угол XYZ
                    [-1.46446, 1.58531, -7.18519],	// Левый Нижний Угол XYZ
                    [-1.46444, 1.589, -5.90477],		// Правый Нижний Угол XYZ
                    [-1.46219, 1.81742, -5.90477],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
        {
            name: 'head-right-dest',
            texArea: [0, 0, 1024, 128],
            pos: [
                [
                    [1.46219, 1.81742, -5.90477],		// Левый Верхний Угол XYZ
                    [1.46443, 1.589, -5.90477],	// Левый Нижний Угол XYZ
                    [1.46446, 1.58531, -7.18519],		// Правый Нижний Угол XYZ
                    [1.46214, 1.82303, -7.18519],		// Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let slotTailRouteCfg = {						    // ЭМУ МАРШРУТ ХВОСТОВОЙ (КРАСНЫЕ ОГНИ) ВАГОН
    version: 1,
    texSize: [256, 128],
    slots: [
        {
            name: 'tail-route',
            texArea: [0, 0, 256, 128],
            pos: [
                [
                    [0, 0, 0],     // Левый Верхний Угол XYZ
                    [0, 0, 0],     // Левый Нижний Угол XYZ
                    [0, 0, 0],     // Правый Нижний Угол XYZ
                    [0, 0, 0],     // Правый Верхний Угол XYZ
                ],
            ],
            offsets: [[0, 0, 0]],
        },
    ],
};

let dhHeadBaseDest = new DisplayHelper(slotHeadDestCfg);
let dhHeadBaseRoute = new DisplayHelper(slotHeadRouteCfg);
let dhWagDest = new DisplayHelper(slotWagCfg);
let dhWagDest2 = new DisplayHelper(slotWag2Cfg);
let dhPromDest = new DisplayHelper(slotPromCfg);
let dhPromDest2 = new DisplayHelper(slotProm2Cfg);
let dhTailBaseDest = new DisplayHelper(slotTailDestCfg);
let dhTailBaseRoute = new DisplayHelper(slotTailRouteCfg);

function create(ctx, state, train) {                                        // Генератор номера маршрута
    state.pisRateLimit = new RateLimit(0.05);
    state.dhHeadDest = dhHeadBaseDest.create();
    state.dhHeadRoute = dhHeadBaseRoute.create();
    state.dhTailDest = dhTailBaseDest.create();
    state.dhWagDest = dhWagDest.create();
    state.dhWagDest2 = dhWagDest.create();
    state.dhPromDest = dhPromDest.create();
    state.dhPromDest2 = dhPromDest2.create();
    state.dhTailRoute = dhTailBaseRoute.create();
    state.routeIDmath = Math.floor(1 + (Math.random() * 59));			            // Генерация рандомного номера маршрута (От 1 до 30 включительно)
    return (state.routeID = state.routeIDmath);
}

function dispose(ctx, state, train) {                                       // В душе не ебу что это но это важно
    state.dhHeadDest.close();
    state.dhHeadRoute.close();
    state.dhWagDest.close();
    state.dhPromDest.close();
    state.dhPromDest2.close();
    state.dhTailDest.close();
    state.dhTailRoute.close();
}
var EMUFont = Resources.readFont(                                           // Шрифт ЭМУ
    Resources.idRelative('mtr:fronts/timessquare.ttf')
);

function render(ctx, state, train) {                                        // Рендер ЭМУ
    if (state.pisRateLimit.shouldUpdate()) {
        let g;

        let EMUText = getDestinationStation(train);

        [																	    // Вывод конечной станции на ЭМУ
            { dh: state.dhHeadDest, graphicsName: 'head-dest' },
            { dh: state.dhHeadDest, graphicsName: 'head-left-dest' },
            { dh: state.dhHeadDest, graphicsName: 'head-right-dest' },
            { dh: state.dhTailDest, graphicsName: 'tail-dest' },

            { dh: state.dhWagDest, graphicsName: 'wag-left-dest1' },
            { dh: state.dhWagDest, graphicsName: 'wag-left-dest2' },
            { dh: state.dhWagDest2, graphicsName: 'wag-left-dest1' },
            { dh: state.dhWagDest2, graphicsName: 'wag-left-dest2' },

            { dh: state.dhPromDest, graphicsName: 'head-left-dest' },
            { dh: state.dhPromDest, graphicsName: 'head-left-dest' },
            { dh: state.dhPromDest2, graphicsName: 'head-left-dest' },
            { dh: state.dhPromDest2, graphicsName: 'head-left-dest' },

        ].forEach((element) => {
            let dh = element.dh;
            g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);									            // Цвет заднего фона
            g.fillRect(0, 0, 1024, 128);								                // Площадь заливки заднего фона
            g.setColor(Color.ORANGE); 									            // Цвет текста
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 120)); 			            // Размер шрифта
            let fontMetrics = g.getFontMetrics();
            let textWidth = fontMetrics.stringWidth(EMUText);
            g.drawString(EMUText, (1024 - textWidth) / 2, 115);                     // Формула для вывода на экран
            dh.upload();
        }),
		
		[																	    // Вывод номера маршрута на ЭМУ
            { dh: state.dhHeadRoute, graphicsName: 'head-route' },
            { dh: state.dhTailRoute, graphicsName: 'tail-route' },
        ].forEach((element) => {
            let dh = element.dh;
            g = dh.graphicsFor(element.graphicsName);
            g.setColor(Color.BLACK);									            // Цвет заднего фона
            g.fillRect(0, 0, 256, 128);								                    // Площадь заливки заднего фона
            g.setColor(Color.GREEN); 									            // Цвет текста
            g.setFont(EMUFont.deriveFont(Font.PLAIN, 110)); 			            // Размер шрифта
            g.drawString(state.routeID, 45, 115);                                   // Формула для вывода на экран
            dh.upload();
        });
    }

    ctx.drawCarModel(state.dhHeadDest.model, 0, null);
    ctx.drawCarModel(state.dhHeadRoute.model, 0, null);
    ctx.drawCarModel(state.dhWagDest.model, 1, null);
    ctx.drawCarModel(state.dhPromDest.model, 2, null);
    ctx.drawCarModel(state.dhPromDest2.model, train.trainCars() - 3, null);
    ctx.drawCarModel(state.dhWagDest2.model, train.trainCars() - 2, null);
    ctx.drawCarModel(state.dhTailDest.model, train.trainCars() - 1, null);
    ctx.drawCarModel(state.dhTailRoute.model, train.trainCars() - 1, null);
}

function getDestinationStation(train) {                                     // Получение данных о конечной станции
    let stationList = train.getThisRoutePlatforms();
    let lastPlatform = stationList[stationList.size() - 1];
    if (lastPlatform === undefined) return 'NICHT EINSTEIGEN';					    // Выводимая на ЭМУ надпись в отсутствии конечной станции (При возврате/в Депо)
    return lastPlatform.destinationName.split('\\|')[0];
}
