/// <reference path="../includes.ts" />

/*

"Translates "

Usage:

{{ details.ADH1B | alleles : separator : replacement }}

details.ADH1B = '*1*2';

{{ details.ADH1B | alleles : '' : {'*1':'G', '*2': 'A'} }} => GA

{{ details.ADH1B | alleles : '/' } }} => *1/*2


*/

((angular): void => {
    interface IAlleles{
        allele1:string,
        allele2:string
    };

    class AllelesFilter {                
        constructor() {
            let getAlleles = (value:string): IAlleles=> {
                let alleleLength = value.length / 2; // assuming alleles will have same length

                return {allele1:value.substr(0, alleleLength), allele2:value.substr(alleleLength, alleleLength)};
            };

            let applyReplacement = (value:string, replacement:object) :string =>{
                let replaceWith = replacement[value];
                return angular.isDefined(replaceWith) ? replaceWith: value;
            }
            
            return (value: string, separator?: string, replacement?: object): string => {                
                if (!value || !value.trim()) {
                    return value;
                }

                let hasSeparator = separator && separator.trim(); 
                let hasReplacement = !!replacement;

                if (!hasSeparator && !hasReplacement) {
                    return value;
                }
                
                let {allele1, allele2} = getAlleles(value);
                            
                if(hasReplacement){
                    allele1 = applyReplacement(allele1, replacement);
                    allele2 = applyReplacement(allele2, replacement);
                }            

                if(hasSeparator){
                    return `${allele1}${separator}${allele2}`;
                }
                return `${allele1}${allele2}`;
            }
        }
    }

    angular.module('app').filter('alleles', AllelesFilter);
})(angular);