import { SimpleSchema } from 'meteor/aldeed:simple-schema';

const serverNameDefinitions = {
    type: String,
    label: 'Server Name',
    max: 100
};

const serverTypeDefinitions = {
    type: String,
    label: 'Server Type',
    allowedValues: ['dicomWeb', 'dimse'],
    valuesLabels: ['DICOM Web', 'DIMSE'],
    optional: true
};

const wadoUriRootDefinitions = {
    type: String,
    label: 'WADO URI root',
    max: 1000
};

const availableMouseButtonTools = ['wwwc', 'zoom', 'pan', 'stackScroll'];

export const DICOMWebRequestOptions = new SimpleSchema({
    auth: {
        type: String,
        label: 'Authentication',
        defaultValue: 'orthanc:orthanc',
        optional: true
    },
    logRequests: {
        type: Boolean,
        defaultValue: true,
        label: 'Requests'
    },
    logResponses: {
        type: Boolean,
        defaultValue: false,
        label: 'Responses'
    },
    logTiming: {
        type: Boolean,
        defaultValue: true,
        label: 'Timing'
    }
});

export const DICOMWebServer = new SimpleSchema({
    name: serverNameDefinitions,
    type: serverTypeDefinitions,
    wadoUriRoot: wadoUriRootDefinitions,
    wadoRoot: {
        type: String,
        label: 'WADO root',
        max: 1000
    },
    imageRendering: {
        type: String,
        label: 'Image rendering',
        allowedValues: ['wadouri', 'wadors', 'orthanc'],
        valuesLabels: ['WADO URI', 'WADO RS', 'ORTHANC'],
        defaultValue: 'wadouri'
    },
    thumbnailRendering: {
        type: String,
        label: 'Thumbnail rendering',
        allowedValues: ['wadouri', 'wadors', 'orthanc'],
        valuesLabels: ['WADO URI', 'WADO RS', 'ORTHANC'],
        defaultValue: 'wadouri'
    },
    qidoRoot: {
        type: String,
        label: 'QIDO root',
        max: 1000
    },
    qidoSupportsIncludeField: {
        type: Boolean,
        label: 'QIDO supports including fields',
        defaultValue: false
    },
    requestOptions: {
        type: DICOMWebRequestOptions,
        label: 'Request Options'
    }
});

export const DIMSEPeer = new SimpleSchema({
    aeTitle: {
        type: String,
        label: 'AE Title'
    },
    hostAE: {
        type: String,
        label: 'AE Host',
        optional: true
    },
    host: {
        type: String,
        label: 'Host Domain/IP',
        regEx: SimpleSchema.RegEx.WeakDomain
    },
    port: {
        type: Number,
        label: 'Port',
        min: 1,
        defaultValue: 11112,
        max: 65535
    },
    default: {
        type: Boolean,
        label: 'Default',
        defaultValue: false
    },
    server: {
        type: Boolean,
        label: 'Server',
        defaultValue: false
    },
    supportsInstanceRetrievalByStudyUid: {
        type: Boolean,
        label: 'Supports instance retrieval by StudyUid',
        defaultValue: true
    }
});

export const DIMSEServer = new SimpleSchema({
    name: serverNameDefinitions,
    type: serverTypeDefinitions,
    wadoUriRoot: wadoUriRootDefinitions,
    requestOptions: {
        type: DICOMWebRequestOptions,
        label: 'Request Options'
    },
    peers: {
        type: [DIMSEPeer],
        label: 'Peer List',
        minCount: 1
    }
});

export const UISettings = new SimpleSchema({
    studyListFunctionsEnabled: {
        type: Boolean,
        label: 'Study List Functions Enabled?',
        defaultValue: true
    },
    leftSidebarOpen: {
        type: Boolean,
        label: 'Left sidebar open by default?',
        defaultValue: false
    },
    leftSidebarDragAndDrop: {
        type: Boolean,
        label: 'Left sidebar allows thumbnail drag and drop. If false, images will be loaded on single click.',
        defaultValue: true
    },
    displaySetNavigationLoopOverSeries: {
        type: Boolean,
        label: 'The UP/DOWN display set navigation buttons will start over when reach the last display set in viewport?',
        defaultValue: true
    },
    displaySetNavigationMultipleViewports: {
        type: Boolean,
        label: 'The UP/DOWN display set navigation buttons will iterate over all the viewports at once?',
        defaultValue: false
    },
    displayEchoUltrasoundWorkflow: {
        type: Boolean,
        label: 'Enable cine dialog enhancements for multiframe images.',
        defaultValue: false
    },
    autoPositionMeasurementsTextCallOuts: {
        type: String,
        label: 'Auto position text call-outs for measurements when creating them.',
        defaultValue: 'TRBL'
    },
    studyListDateFilterNumDays: {
        type: Number,
        label: 'Number of days to be used on Study List date filter',
        min: 1
    },
    showStackLoadingProgressBar: {
        type: Boolean,
        label: 'Show a progress bar closest to the thumbnail showing how much the stack has loaded',
        defaultValue: true
    },
    cornerstoneRenderer: {
        type: String,
        label: 'Cornerstone default image renderer',
        defaultValue: 'webgl'
    },
    sortSeriesByIncomingOrder: {
        type: Boolean,
        label: 'Define if the series\' images shall be sorted by incoming order. Sort by Instance Number by default.',
        defaultValue: false
    },
    useMiddleSeriesInstanceAsThumbnail: {
        type: Boolean,
        label: 'Define if the middle instance of a series will be used as thumbnail. If not, the first instance will be used.',
        defaultValue: true
    }
});

export const PrefetchSchema = new SimpleSchema({
    order: {
        type: String,
        label: 'Prefetch Order',
        allowedValues: ['topdown', 'downward', 'closest'],
        optional: false
    },
    displaySetCount: {
        type: Number,
        label: 'Display Set Count',
        min: 1,
        defaultValue: 1
    }
});

export const MouseButtonToolSchema = new SimpleSchema({
    left: {
        type: String,
        label: 'Left Mouse Button',
        allowedValues: availableMouseButtonTools,
        optional: true
    },
    right: {
        type: String,
        label: 'Right Mouse Button',
        allowedValues: availableMouseButtonTools,
        optional: true
    },
    middle: {
        type: String,
        label: 'Middle Mouse Button',
        allowedValues: availableMouseButtonTools,
        optional: true
    }
});

export const PublicServerConfig = new SimpleSchema({
    verifyEmail: {
        type: Boolean,
        label: 'Verify Email',
        defaultValue: false
    },
    demoUserEnabled: {
        type: Boolean,
        label: 'Creates demo user on startup and show TestDrive button',
        defaultValue: true
    },
    ui: {
        type: UISettings,
        label: 'UI Settings'
    },
    prefetch: {
        type: PrefetchSchema,
        label: 'Prefetch settings'
    },
    defaultMouseButtonTools: {
        type: MouseButtonToolSchema,
        label: 'Default Mouse Button Tools'
    }
});

export const Servers = new SimpleSchema({
    dicomWeb: {
        type: [DICOMWebServer],
        label: 'DICOMWeb Servers',
        optional: true
    },
    dimse: {
        type: [DIMSEServer],
        label: 'DIMSE Servers',
        optional: true
    }
});

export const ServerConfiguration = new SimpleSchema({
    servers: {
        type: Servers,
        label: 'Servers'
    },
    defaultServiceType: {
        type: String,
        label: 'Default Service Type',
        defaultValue: 'dicomWeb'
    },
    dropCollections: {
        type: Boolean,
        label: 'Drop database collections',
        defaultValue: false
    },
    public: {
        type: PublicServerConfig,
        label: 'Public Server Configuration',
    },
    origin: {
        type: String,
        label: 'Origin',
        optional: true
    }
});
