const get = require('lodash/get');

const shapes = require('./components/shapes');

const stringSort = (k, desc) => {
    if (desc) {
        return (a, b) => {
            if (!get(a, k)) return 1;
            if (!get(b, k)) return -1;
            return get(b, k).localeCompare(get(a, k));
        };
    }
    return (a, b) => {
        if (!get(a, k)) return 1;
        if (!get(b, k)) return -1;
        return get(a, k).localeCompare(get(b, k));
    };
};

const numSort = (k, desc) => {
    if (desc) {
        return (a, b) => {
            if (!get(a, k)) return 1;
            if (!get(b, k)) return -1;
            return get(b, k) - get(a, k);
        };
    }
    return (a, b) => {
        if (!get(a, k)) return 1;
        if (!get(b, k)) return -1;
        return get(a, k) - get(b, k);
    };
};

const genAvatar = (name) => {
    let hash = 0;
    if (name.length === 0) return hash;
    // Probs don't need to hash using the whole string
    for (let i = 0; i < name.length; i += 1) {
        const chr = name.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash = hash & 10000; // We have avatars named 0-19
    }
    return `sprite${hash}`;
};

function requestAvatar(name) {
    const id = genAvatar(name);
    const req = new Request(`/assets/molecules/${id}.svg`);
    return fetch(req)
        .then(res => res.text())
        .then(svg => svg);
}

const NULL_UUID = '00000000-0000-0000-0000-000000000000';

const STATS = {
    speed: { stat: 'speed', colour: '', svg: shapes.triangle },
    redDamage: { stat: 'red_damage', colour: 'red', svg: shapes.circle },
    greenDamage: { stat: 'green_damage', colour: 'green', svg: shapes.circle },
    blueDamage: { stat: 'blue_damage', colour: 'blue', svg: shapes.circle },
    redShield: { stat: 'red_shield', colour: 'red', svg: shapes.square },
    hp: { stat: 'hp', colour: 'green', svg: shapes.square },
    blueShield: { stat: 'blue_shield', colour: 'blue', svg: shapes.square },
};

const SPECS = {
    Hp: { colour: 'white', caption: 'Hp', svg: shapes.square },
    RedShieldI: { colour: 'red', caption: 'HpI', svg: shapes.square },
    BlueShieldI: { colour: 'blue', caption: 'HpI', svg: shapes.square },
    LifeI: { colour: 'green', caption: 'HpI', svg: shapes.square },
    LRSI: { colour: 'yellow', caption: 'HpI', svg: shapes.square },
    LBSI: { colour: 'cyan', caption: 'HpI', svg: shapes.square },
    RBSI: { colour: 'purple', caption: 'HpI', svg: shapes.square },

    Damage: { colour: 'white', caption: 'Damage', svg: shapes.hexagon },
    RedDamageI: { colour: 'red', caption: 'DamageI', svg: shapes.hexagon },
    BlueDamageI: { colour: 'blue', caption: 'DamageI', svg: shapes.hexagon },
    GreenDamageI: { colour: 'green', caption: 'DamageI', svg: shapes.hexagon },
    GRDI: { colour: 'yellow', caption: 'DamageI', svg: shapes.hexagon },
    GBDI: { colour: 'cyan', caption: 'DamageI', svg: shapes.hexagon },
    RBDI: { colour: 'purple', caption: 'DamageI', svg: shapes.hexagon },

    Speed: { colour: 'white', caption: 'Speed', svg: shapes.diamond },
    RedSpeed: { colour: 'red', caption: 'SpeedI', svg: shapes.diamond },
    BlueSpeedI: { colour: 'blue', caption: 'SpeedI', svg: shapes.diamond },
    GreenSpeedI: { colour: 'green', caption: 'speed', svg: shapes.diamond },
    GRSpeedI: { colour: 'yellow', caption: 'SpeedI', svg: shapes.diamond },
    GBSpeedI: { colour: 'cyan', caption: 'SpeedI', svg: shapes.diamond },
    RBSpeedI: { colour: 'purple', caption: 'SpeedI', svg: shapes.diamond },

};

const COLOUR_ICONS = {
    red: { colour: 'red', caption: 'red', svg: shapes.circle },
    blue: { colour: 'blue', caption: 'blue', svg: shapes.circle },
    green: { colour: 'green', caption: 'green', svg: shapes.circle },
};

module.exports = {
    stringSort,
    numSort,
    genAvatar,
    requestAvatar,
    NULL_UUID,
    STATS,
    SPECS,
    COLOUR_ICONS,
};
