import { GetPerpsQuote, CommitOrder, ModifyCollateral, PayDebt, CreateIsolateOrder, GrantPermission, GetPermissions, AccountPermissions } from './index.mjs';
import { MarketSummary, SettlementStrategy, FundingParameters, OrderFees, MaxMarketValue, OrderData, CollateralData, OpenPositionData, OrderQuote, MarketMetadata, MarketData } from '../../perps/interface.mjs';
import { MarketIdOrName, OverrideParamsWrite, WriteReturnType } from '../commonTypes.mjs';
import { Call3Value } from '../contractTypes.mjs';
import 'viem';
import '../../constants/perpsPermissions.mjs';

type MarketsBy<T> = Map<T, MarketData>;
type MarketById = MarketsBy<number>;
type MarketByName = MarketsBy<string>;
type MarketMeta = Map<number, MarketMetadata>;
interface PerpsRepository {
    marketMetadata: MarketMeta;
    marketsById: MarketById;
    marketsByName: MarketByName;
    marketsBySymbol: MarketByName;
    isErc7412Enabled: boolean;
    isMulticollateralEnabled: boolean;
    disabledMarkets: number[];
    initPerps(): Promise<void>;
    resolveMarket(marketIdOrName: MarketIdOrName): Promise<{
        resolvedMarketId: number;
        resolvedMarketName: string;
    }>;
    getAccountIds(address?: string, defaultAccountId?: bigint): Promise<bigint[]>;
    getMarketSummaries(marketIds: number[]): Promise<MarketSummary[]>;
    getMarketSummary(marketIdOrName: MarketIdOrName): Promise<MarketSummary>;
    getSettlementStrategy(settlementId: number, marketIdOrName: MarketIdOrName): Promise<SettlementStrategy>;
    getSettlementStrategies(marketIds: number[]): Promise<SettlementStrategy[]>;
    getFundingParameters(marketIds: number[]): Promise<FundingParameters[]>;
    getOrderFees(marketIds: number[]): Promise<OrderFees[]>;
    getMaxMarketValues(marketIds: number[]): Promise<MaxMarketValue[]>;
    getOrder(accountId?: bigint, fetchSettlementStrategy?: boolean): Promise<OrderData>;
    getMarginInfo(accountId?: bigint): Promise<CollateralData>;
    getCollateralBalances(accountId?: bigint): Promise<number>;
    getCanLiquidate(accountId?: bigint): Promise<boolean>;
    getCanLiquidates(accountIds: bigint[]): Promise<{
        accountId: bigint;
        canLiquidate: boolean;
    }[]>;
    getOpenPosition(marketIdOrName: MarketIdOrName, accountId?: bigint): Promise<OpenPositionData>;
    getOpenPositions(marketIdsOrNames: MarketIdOrName[], accountIds?: bigint): Promise<OpenPositionData[]>;
    getOpenPositionsMulticall(positions: {
        accountId: bigint;
        marketIdOrName: MarketIdOrName;
    }[]): Promise<OpenPositionData[]>;
    getQuote(data: GetPerpsQuote): Promise<OrderQuote>;
    getDebt(accountId?: bigint): Promise<number>;
    prepareOracleCall(marketIds: number[]): Promise<Call3Value[]>;
    createAccount(accountId?: bigint, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    commitOrder(data: CommitOrder, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    modifyCollateral(data: ModifyCollateral, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    payDebt(data: PayDebt, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    liquidate(accountId?: bigint, override?: OverrideParamsWrite): Promise<WriteReturnType | number>;
    settleOrder(accountId?: bigint, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    createIsolatedAccountOrder(data: CreateIsolateOrder, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    grantPermission(data: GrantPermission, override?: OverrideParamsWrite): Promise<WriteReturnType>;
    getAccountPermissions(data: GetPermissions): Promise<AccountPermissions[]>;
}

export type { PerpsRepository };
