"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RopidGtfsRouteSubAgencyTransformation = void 0;
const AbstractTransformation_1 = require("@golemio/core/dist/helpers/transformation/AbstractTransformation");
const golemio_errors_1 = require("@golemio/core/dist/shared/golemio-errors");
const tsyringe_1 = require("@golemio/core/dist/shared/tsyringe");
let RopidGtfsRouteSubAgencyTransformation = class RopidGtfsRouteSubAgencyTransformation extends AbstractTransformation_1.AbstractTransformation {
    constructor() {
        super();
        this.name = "RopidGtfsRouteSubAgencyTransformation";
        this.transformArray = (input, includeDuplicates = false) => {
            const output = [];
            for (let index = 0; index < input.length; index++) {
                const element = input[index];
                if (!element.route_id) {
                    continue;
                }
                if (!/^\d+$/.test(element.sub_agency_id)) {
                    new golemio_errors_1.GeneralError(`sub_agency_id should be number, got ${element.sub_agency_id} for route_id ${element.route_id}`, this.name);
                }
                output.push(this.transformElement(element));
            }
            return !includeDuplicates ? this.filterDuplicates(output) : output;
        };
        /**
         * Filter duplicates by route_id and sub_agency_id.
         * In case of duplicates, keep the first one in order with route_licence_number.
         */
        this.filterDuplicates = (data) => {
            const transformation = {};
            for (let index = 0; index < data.length; index++) {
                const element = data[index];
                const key = `${element.route_id}-${element.sub_agency_id}`;
                if (!transformation[key]) {
                    transformation[key] = element;
                }
                else if (!transformation[key].route_licence_number && element.route_licence_number) {
                    transformation[key] = element;
                }
            }
            return Object.values(transformation);
        };
        this.transformInternal = (data) => {
            return {
                route_id: data.route_id,
                route_licence_number: /^\d+$/.test(data.route_licence_number) ? Number.parseInt(data.route_licence_number) : null,
                sub_agency_id: Number.parseInt(data.sub_agency_id),
                sub_agency_name: data.sub_agency_name,
            };
        };
    }
};
exports.RopidGtfsRouteSubAgencyTransformation = RopidGtfsRouteSubAgencyTransformation;
exports.RopidGtfsRouteSubAgencyTransformation = RopidGtfsRouteSubAgencyTransformation = __decorate([
    (0, tsyringe_1.injectable)(),
    __metadata("design:paramtypes", [])
], RopidGtfsRouteSubAgencyTransformation);
//# sourceMappingURL=RopidGtfsRouteSubAgencyTransformation.js.map