"use strict";
// SPDX-License-Identifier: Apache-2.0
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);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const SetVotingRightsCommand_1 = require("../../../app/usecase/command/equity/votingRights/set/SetVotingRightsCommand");
const CancelVotingCommand_1 = require("../../../app/usecase/command/equity/votingRights/cancel/CancelVotingCommand");
const GetVotingQuery_1 = require("../../../app/usecase/query/equity/votingRights/getVoting/GetVotingQuery");
const GetVotingCountQuery_1 = require("../../../app/usecase/query/equity/votingRights/getVotingCount/GetVotingCountQuery");
const GetVotingForQuery_1 = require("../../../app/usecase/query/equity/votingRights/getVotingFor/GetVotingForQuery");
const CancelScheduledBalanceAdjustmentCommand_1 = require("../../../app/usecase/command/equity/balanceAdjustments/cancelScheduledBalanceAdjustment/CancelScheduledBalanceAdjustmentCommand");
const SetScheduledBalanceAdjustmentCommand_1 = require("../../../app/usecase/command/equity/balanceAdjustments/setScheduledBalanceAdjustment/SetScheduledBalanceAdjustmentCommand");
const Injectable_1 = __importDefault(require("../../../core/injectable/Injectable"));
const CommandBus_1 = require("../../../core/command/CommandBus");
const LogErrorDecorator_1 = require("../../../core/decorator/LogErrorDecorator");
const QueryBus_1 = require("../../../core/query/QueryBus");
const SecurityDate_1 = require("../../../domain/context/shared/SecurityDate");
const ValidatedArgs_1 = __importDefault(require("../../../core/validation/ValidatedArgs"));
const SetVotingRightsRequest_1 = __importDefault(require("../request/equity/SetVotingRightsRequest"));
const GetVotingRightsForRequest_1 = __importDefault(require("../request/equity/GetVotingRightsForRequest"));
const GetVotingRightsRequest_1 = __importDefault(require("../request/equity/GetVotingRightsRequest"));
const GetAllVotingRightsRequest_1 = __importDefault(require("../request/equity/GetAllVotingRightsRequest"));
const CreateEquityRequest_1 = __importDefault(require("../request/equity/CreateEquityRequest"));
const NetworkService_1 = __importDefault(require("../../../app/service/network/NetworkService"));
const CreateEquityCommand_1 = require("../../../app/usecase/command/equity/create/CreateEquityCommand");
const ContractId_1 = __importDefault(require("../../../domain/context/contract/ContractId"));
const GetSecurityQuery_1 = require("../../../app/usecase/query/security/get/GetSecurityQuery");
const DividendType_1 = require("../../../domain/context/equity/DividendType");
const BigDecimal_1 = __importDefault(require("../../../domain/context/shared/BigDecimal"));
const GetEquityDetailsRequest_1 = __importDefault(require("../request/equity/GetEquityDetailsRequest"));
const GetEquityDetailsQuery_1 = require("../../../app/usecase/query/equity/get/getEquityDetails/GetEquityDetailsQuery");
const RegulationType_1 = require("../../../domain/context/factory/RegulationType");
const CancelScheduledBalanceAdjustmentRequest_1 = __importDefault(require("../request/equity/CancelScheduledBalanceAdjustmentRequest"));
const SetScheduledBalanceAdjustmentRequest_1 = __importDefault(require("../request/equity/SetScheduledBalanceAdjustmentRequest"));
const GetScheduledBalanceAdjustmentRequest_1 = __importDefault(require("../request/equity/GetScheduledBalanceAdjustmentRequest"));
const GetScheduledBalanceAdjustmentQuery_1 = require("../../../app/usecase/query/equity/balanceAdjustments/getScheduledBalanceAdjustment/GetScheduledBalanceAdjustmentQuery");
const GetScheduledBalanceAdjustmentsCountRequest_1 = __importDefault(require("../request/equity/GetScheduledBalanceAdjustmentsCountRequest"));
const GetScheduledBalanceAdjustmentsCountQuery_1 = require("../../../app/usecase/query/equity/balanceAdjustments/getScheduledBalanceAdjustmentCount/GetScheduledBalanceAdjustmentsCountQuery");
const GetVotingHoldersQuery_1 = require("../../../app/usecase/query/equity/votingRights/getVotingHolders/GetVotingHoldersQuery");
const GetTotalVotingHoldersQuery_1 = require("../../../app/usecase/query/equity/votingRights/getTotalVotingHolders/GetTotalVotingHoldersQuery");
const GetAllScheduledBalanceAdjustmentst_1 = __importDefault(require("../request/equity/GetAllScheduledBalanceAdjustmentst"));
const GetVotingHoldersRequest_1 = __importDefault(require("../request/equity/GetVotingHoldersRequest"));
const GetTotalVotingHoldersRequest_1 = __importDefault(require("../request/equity/GetTotalVotingHoldersRequest"));
const CreateTrexSuiteEquityRequest_1 = __importDefault(require("../request/equity/CreateTrexSuiteEquityRequest"));
const CreateTrexSuiteEquityCommand_1 = require("../../../app/usecase/command/equity/createTrexSuite/CreateTrexSuiteEquityCommand");
const CancelVotingRequest_1 = __importDefault(require("../request/equity/CancelVotingRequest"));
class EquityInPort {
    queryBus;
    commandBus;
    networkService;
    constructor(queryBus = Injectable_1.default.resolve(QueryBus_1.QueryBus), commandBus = Injectable_1.default.resolve(CommandBus_1.CommandBus), networkService = Injectable_1.default.resolve(NetworkService_1.default)) {
        this.queryBus = queryBus;
        this.commandBus = commandBus;
        this.networkService = networkService;
    }
    async createTrexSuite(req) {
        ValidatedArgs_1.default.handleValidation("CreateTrexSuiteEquityRequest", req);
        const { diamondOwnerAccount, externalPauses, externalControlLists, externalKycLists } = req;
        const securityFactory = this.networkService.configuration.factoryAddress;
        const resolver = this.networkService.configuration.resolverAddress;
        const newSecurity = {
            name: req.name,
            symbol: req.symbol,
            isin: req.isin,
            decimals: req.decimals,
            isWhiteList: req.isWhiteList,
            isControllable: req.isControllable,
            arePartitionsProtected: req.arePartitionsProtected,
            clearingActive: req.clearingActive,
            internalKycActivated: req.internalKycActivated,
            isMultiPartition: req.isMultiPartition,
            maxSupply: BigDecimal_1.default.fromString(req.numberOfShares),
            regulationType: RegulationType_1.CastRegulationType.fromNumber(req.regulationType),
            regulationsubType: RegulationType_1.CastRegulationSubType.fromNumber(req.regulationSubType),
            isCountryControlListWhiteList: req.isCountryControlListWhiteList,
            countries: req.countries,
            info: req.info,
            erc20VotesActivated: req.erc20VotesActivated,
        };
        const createResponse = await this.commandBus.execute(new CreateTrexSuiteEquityCommand_1.CreateTrexSuiteEquityCommand(req.salt, req.owner, req.irs, req.onchainId, req.irAgents, req.tokenAgents, req.compliancesModules, req.complianceSettings, req.claimTopics, req.issuers, req.issuerClaims, newSecurity, req.votingRight, req.informationRight, req.liquidationRight, req.subscriptionRight, req.conversionRight, req.redemptionRight, req.putRight, DividendType_1.CastDividendType.fromNumber(req.dividendRight), req.currency, req.nominalValue, req.nominalValueDecimals, new ContractId_1.default(securityFactory), new ContractId_1.default(resolver), req.configId, req.configVersion, diamondOwnerAccount, externalPauses, externalControlLists, externalKycLists, req.complianceId, req.identityRegistryId));
        const securityCreated = createResponse.securityId.toString() !== ContractId_1.default.NULL.toString();
        const res = securityCreated
            ? (await this.queryBus.execute(new GetSecurityQuery_1.GetSecurityQuery(createResponse.securityId.toString()))).security
            : {};
        return {
            security: securityCreated
                ? {
                    ...res,
                }
                : {},
            transactionId: createResponse.transactionId,
        };
    }
    async create(req) {
        ValidatedArgs_1.default.handleValidation("CreateEquityRequest", req);
        const { diamondOwnerAccount, externalPausesIds, externalControlListsIds, externalKycListsIds } = req;
        const securityFactory = this.networkService.configuration.factoryAddress;
        const resolver = this.networkService.configuration.resolverAddress;
        const newSecurity = {
            name: req.name,
            symbol: req.symbol,
            isin: req.isin,
            decimals: req.decimals,
            isWhiteList: req.isWhiteList,
            erc20VotesActivated: req.erc20VotesActivated,
            isControllable: req.isControllable,
            arePartitionsProtected: req.arePartitionsProtected,
            clearingActive: req.clearingActive,
            internalKycActivated: req.internalKycActivated,
            isMultiPartition: req.isMultiPartition,
            maxSupply: BigDecimal_1.default.fromString(req.numberOfShares),
            regulationType: RegulationType_1.CastRegulationType.fromNumber(req.regulationType),
            regulationsubType: RegulationType_1.CastRegulationSubType.fromNumber(req.regulationSubType),
            isCountryControlListWhiteList: req.isCountryControlListWhiteList,
            countries: req.countries,
            info: req.info,
        };
        const createResponse = await this.commandBus.execute(new CreateEquityCommand_1.CreateEquityCommand(newSecurity, req.votingRight, req.informationRight, req.liquidationRight, req.subscriptionRight, req.conversionRight, req.redemptionRight, req.putRight, DividendType_1.CastDividendType.fromNumber(req.dividendRight), req.currency, req.nominalValue, req.nominalValueDecimals, securityFactory ? new ContractId_1.default(securityFactory) : undefined, resolver ? new ContractId_1.default(resolver) : undefined, req.configId, req.configVersion, diamondOwnerAccount, externalPausesIds, externalControlListsIds, externalKycListsIds, req.complianceId, req.identityRegistryId));
        const securityCreated = createResponse.securityId.toString() !== ContractId_1.default.NULL.toString();
        const res = securityCreated
            ? (await this.queryBus.execute(new GetSecurityQuery_1.GetSecurityQuery(createResponse.securityId.toString()))).security
            : {};
        return {
            security: securityCreated
                ? {
                    ...res,
                }
                : {},
            transactionId: createResponse.transactionId,
        };
    }
    async getEquityDetails(request) {
        ValidatedArgs_1.default.handleValidation("GetEquityDetailsRequest", request);
        const res = await this.queryBus.execute(new GetEquityDetailsQuery_1.GetEquityDetailsQuery(request.equityId));
        const equityDetails = {
            votingRight: res.equity.votingRight,
            informationRight: res.equity.informationRight,
            liquidationRight: res.equity.liquidationRight,
            subscriptionRight: res.equity.subscriptionRight,
            conversionRight: res.equity.conversionRight,
            redemptionRight: res.equity.redemptionRight,
            putRight: res.equity.putRight,
            dividendRight: DividendType_1.CastDividendType.toNumber(res.equity.dividendRight),
            currency: res.equity.currency,
            nominalValue: res.equity.nominalValue.toString(),
            nominalValueDecimals: res.equity.nominalValueDecimals,
        };
        return equityDetails;
    }
    async setVotingRights(request) {
        const { recordTimestamp, securityId, data } = request;
        ValidatedArgs_1.default.handleValidation("SetVotingRightsRequest", request);
        return await this.commandBus.execute(new SetVotingRightsCommand_1.SetVotingRightsCommand(securityId, recordTimestamp, data));
    }
    async cancelVoting(request) {
        const { securityId, votingId } = request;
        ValidatedArgs_1.default.handleValidation("CancelVotingRequest", request);
        return await this.commandBus.execute(new CancelVotingCommand_1.CancelVotingCommand(securityId, votingId));
    }
    async getVotingRightsFor(request) {
        ValidatedArgs_1.default.handleValidation("GetVotingRightsForRequest", request);
        const res = await this.queryBus.execute(new GetVotingForQuery_1.GetVotingForQuery(request.targetId, request.securityId, request.votingId));
        const votingFor = {
            tokenBalance: res.tokenBalance.toString(),
            decimals: res.decimals.toString(),
            isDisabled: res.isDisabled,
        };
        return votingFor;
    }
    async getVotingRights(request) {
        ValidatedArgs_1.default.handleValidation("GetVotingRightsRequest", request);
        const res = await this.queryBus.execute(new GetVotingQuery_1.GetVotingQuery(request.securityId, request.votingId));
        const votingRight = {
            votingId: request.votingId,
            recordDate: new Date(res.voting.recordTimeStamp * SecurityDate_1.ONE_THOUSAND),
            data: res.voting.data,
            isDisabled: res.voting.isDisabled,
        };
        return votingRight;
    }
    async getAllVotingRights(request) {
        ValidatedArgs_1.default.handleValidation("GetAllVotingRightsRequest", request);
        const count = await this.queryBus.execute(new GetVotingCountQuery_1.GetVotingCountQuery(request.securityId));
        if (count.payload == 0)
            return [];
        const votingRights = [];
        for (let i = 1; i <= count.payload; i++) {
            const res = await this.queryBus.execute(new GetVotingQuery_1.GetVotingQuery(request.securityId, i));
            const votingright = {
                votingId: i,
                recordDate: new Date(res.voting.recordTimeStamp * SecurityDate_1.ONE_THOUSAND),
                data: res.voting.data,
                isDisabled: res.voting.isDisabled,
            };
            votingRights.push(votingright);
        }
        return votingRights;
    }
    async setScheduledBalanceAdjustment(request) {
        const { executionDate, factor, decimals, securityId } = request;
        ValidatedArgs_1.default.handleValidation("SetScheduledBalanceAdjustmentRequest", request);
        return await this.commandBus.execute(new SetScheduledBalanceAdjustmentCommand_1.SetScheduledBalanceAdjustmentCommand(securityId, executionDate, factor, decimals));
    }
    async getScheduledBalanceAdjustment(request) {
        ValidatedArgs_1.default.handleValidation("GetScheduledBalanceAdjustmentRequest", request);
        const res = await this.queryBus.execute(new GetScheduledBalanceAdjustmentQuery_1.GetScheduledBalanceAdjustmentQuery(request.securityId, request.balanceAdjustmentId));
        const scheduledBalanceAdjustment = {
            id: request.balanceAdjustmentId,
            executionDate: new Date(res.scheduleBalanceAdjustment.executionTimeStamp * SecurityDate_1.ONE_THOUSAND),
            factor: res.scheduleBalanceAdjustment.factor.toString(),
            decimals: res.scheduleBalanceAdjustment.decimals.toString(),
            isDisabled: res.scheduleBalanceAdjustment.isDisabled,
        };
        return scheduledBalanceAdjustment;
    }
    async getScheduledBalanceAdjustmentsCount(request) {
        const { securityId } = request;
        ValidatedArgs_1.default.handleValidation("GetScheduledBalanceAdjustmentCountRequest", request);
        const getScheduledBalanceAdjustmentCountQueryResponse = await this.queryBus.execute(new GetScheduledBalanceAdjustmentsCountQuery_1.GetScheduledBalanceAdjustmentCountQuery(securityId));
        return getScheduledBalanceAdjustmentCountQueryResponse.payload;
    }
    async getAllScheduledBalanceAdjustments(request) {
        ValidatedArgs_1.default.handleValidation("GetAllScheduledBalanceAdjustmentsRequest", request);
        const count = await this.queryBus.execute(new GetScheduledBalanceAdjustmentsCountQuery_1.GetScheduledBalanceAdjustmentCountQuery(request.securityId));
        if (count.payload == 0)
            return [];
        const scheduledBalanceAdjustments = [];
        for (let i = 1; i <= count.payload; i++) {
            const res = await this.queryBus.execute(new GetScheduledBalanceAdjustmentQuery_1.GetScheduledBalanceAdjustmentQuery(request.securityId, i));
            const scheduledBalanceAdjustment = {
                id: i,
                executionDate: new Date(res.scheduleBalanceAdjustment.executionTimeStamp * SecurityDate_1.ONE_THOUSAND),
                factor: res.scheduleBalanceAdjustment.factor.toString(),
                decimals: res.scheduleBalanceAdjustment.decimals.toString(),
                isDisabled: res.scheduleBalanceAdjustment.isDisabled,
            };
            scheduledBalanceAdjustments.push(scheduledBalanceAdjustment);
        }
        return scheduledBalanceAdjustments;
    }
    async getVotingHolders(request) {
        const { securityId, voteId, start, end } = request;
        ValidatedArgs_1.default.handleValidation(GetVotingHoldersRequest_1.default.name, request);
        return (await this.queryBus.execute(new GetVotingHoldersQuery_1.GetVotingHoldersQuery(securityId, voteId, start, end))).payload;
    }
    async getTotalVotingHolders(request) {
        const { securityId, voteId } = request;
        ValidatedArgs_1.default.handleValidation(GetTotalVotingHoldersRequest_1.default.name, request);
        return (await this.queryBus.execute(new GetTotalVotingHoldersQuery_1.GetTotalVotingHoldersQuery(securityId, voteId))).payload;
    }
    async cancelScheduledBalanceAdjustment(request) {
        const { securityId, balanceAdjustmentId } = request;
        ValidatedArgs_1.default.handleValidation("CancelScheduledBalanceAdjustmentRequest", request);
        return await this.commandBus.execute(new CancelScheduledBalanceAdjustmentCommand_1.CancelScheduledBalanceAdjustmentCommand(securityId, balanceAdjustmentId));
    }
}
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [CreateTrexSuiteEquityRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "createTrexSuite", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [CreateEquityRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "create", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetEquityDetailsRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getEquityDetails", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [SetVotingRightsRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "setVotingRights", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [CancelVotingRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "cancelVoting", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetVotingRightsForRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getVotingRightsFor", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetVotingRightsRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getVotingRights", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetAllVotingRightsRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getAllVotingRights", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [SetScheduledBalanceAdjustmentRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "setScheduledBalanceAdjustment", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetScheduledBalanceAdjustmentRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getScheduledBalanceAdjustment", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetScheduledBalanceAdjustmentsCountRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getScheduledBalanceAdjustmentsCount", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetAllScheduledBalanceAdjustmentst_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getAllScheduledBalanceAdjustments", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetVotingHoldersRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getVotingHolders", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [GetTotalVotingHoldersRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "getTotalVotingHolders", null);
__decorate([
    LogErrorDecorator_1.LogError,
    __metadata("design:type", Function),
    __metadata("design:paramtypes", [CancelScheduledBalanceAdjustmentRequest_1.default]),
    __metadata("design:returntype", Promise)
], EquityInPort.prototype, "cancelScheduledBalanceAdjustment", null);
const EquityToken = new EquityInPort();
exports.default = EquityToken;
