export interface LineColumn {
    line: number;
    column: number;
}

export interface SourceRange {
    location: SingleFileSourceRange;
    fileName: string;
}

export interface SingleFileSourceRange {
    start: LineColumn;
    end: LineColumn;
}

export interface LocationByOffset {
    [offset: number]: LineColumn;
}

export interface FunctionDescription {
    name: string;
    line: number;
    loc: SingleFileSourceRange;
    skip?: boolean;
}

export type StatementDescription = SingleFileSourceRange;

export interface BranchDescription {
    line: number;
    type: 'if' | 'switch' | 'cond-expr' | 'binary-expr';
    locations: SingleFileSourceRange[];
}

export interface FnMap {
    [functionId: string]: FunctionDescription;
}

export interface BranchMap {
    [branchId: string]: BranchDescription;
}

export interface StatementMap {
    [statementId: string]: StatementDescription;
}

export interface LineCoverage {
    [lineNo: number]: boolean;
}

export interface FunctionCoverage {
    [functionId: string]: boolean;
}

export interface StatementCoverage {
    [statementId: string]: boolean;
}

export interface BranchCoverage {
    [branchId: string]: boolean[];
}

export interface Coverage {
    [fineName: string]: {
        l: LineCoverage;
        f: FunctionCoverage;
        s: StatementCoverage;
        b: BranchCoverage;
        fnMap: FnMap;
        branchMap: BranchMap;
        statementMap: StatementMap;
        path: string;
    };
}

export interface ContractData {
    bytecode: string;
    sourceMap: string;
    runtimeBytecode: string;
    sourceMapRuntime: string;
    sourceCodes: string[];
    sources: string[];
}

export interface TraceInfoBase {
    coveredPcs: number[];
    txHash: string;
}

export interface TraceInfoNewContract extends TraceInfoBase {
    address: 'NEW_CONTRACT';
    bytecode: string;
}

export interface TraceInfoExistingContract extends TraceInfoBase {
    address: string;
    runtimeBytecode: string;
}

export type TraceInfo = TraceInfoNewContract | TraceInfoExistingContract;
