const util = require( './util' );

const renderColourAsRGB = util.renderColourAsRGB;
const renderColourAsRGBA = util.renderColourAsRGBA;
const renderColourAsHex = util.renderColourAsHex;

// ───────────────────────────────────────────────────────────────────
//          ╭───────────────────────────────────────────────╮
//          │   Theme generator (returns theme as object)   │
//          ╰───────────────────────────────────────────────╯
// ───────────────────────────────────────────────────────────────────
module.exports.generateTheme = (
    theme, wallpaper, lockpaper, palette
) => {
    return {
        'wallpaper-path': wallpaper,
        'lockpaper-path': lockpaper,

        // ┌                                               ┐
        // │                    Colours                    │
        // └                                               ┘
        // ── Foreground ───────────────────────────────────────────────────
        'colour-foreground-hex': renderColourAsHex( colours.foreground[ theme ] ),
        'colour-foreground-rgb': renderColourAsRGB( colours.foreground[ theme ] ),
        'colour-foreground-rgba': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ),
        'colour-foreground-rgba-07': renderColourAsRGBA( colours.foreground[ theme ], 0.7 ),
        'colour-foreground-rgba-06': renderColourAsRGBA( colours.foreground[ theme ], 0.6 ),
        'colour-foreground-rgba-05': renderColourAsRGBA( colours.foreground[ theme ], 0.5 ),
        'colour-foreground-rgba-03': renderColourAsRGBA( colours.foreground[ theme ], 0.3 ),
        'colour-foreground-rgba-02': renderColourAsRGBA( colours.foreground[ theme ], 0.2 ),
        'colour-foreground-rgba-01': renderColourAsRGBA( colours.foreground[ theme ], 0.1 ),

        // ── Accent foreground colour ─────────────────────────────────────
        'colour-foreground-accent-hex': renderColourAsHex( colours['foreground-accent'][ theme ] ),
        'colour-foreground-accent-rgba-07': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.7 ),
        'colour-foreground-accent-rgba-06': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.6 ),
        'colour-foreground-accent-rgba-05': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.5 ),
        'colour-foreground-accent-rgba-03': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.3 ),
        'colour-foreground-accent-rgba-02': renderColourAsRGBA( colours['foreground-accent'][ theme ], 0.2 ),

        // ── Accent colour ────────────────────────────────────────────────
        'colour-accent-hex': renderColourAsHex( palette[ 0 ] ),
        'colour-accent-rgb': renderColourAsRGB( palette[ 0 ] ),
        'colour-accent-rgba': renderColourAsRGBA( palette[ 0 ], 0.3 ),
        'colour-accent-rgba-07': renderColourAsRGBA( palette[ 0 ], 0.7 ),
        'colour-accent-rgba-05': renderColourAsRGBA( palette[ 0 ], 0.5 ),
        'colour-accent-rgba-03': renderColourAsRGBA( palette[ 0 ], 0.3 ),
        'colour-accent-rgba-02': renderColourAsRGBA( palette[ 0 ], 0.2 ),
        'colour-accent-rgba-015': renderColourAsRGBA( palette[ 0 ], 0.15 ),
        'colour-accent-rgba-011': renderColourAsRGBA( palette[ 0 ], 0.11 ),
        'colour-accent-rgba-007': renderColourAsRGBA( palette[ 0 ], 0.07 ),
        'colour-accent-hyprland': util.renderColourAsRGBAHex( palette[ 0 ], 0.8 ),
        // ───────────────────────────────────────────────────────────────────
        'colour-accent-gradient-1-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 1, gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-2-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 2, gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-3-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 3, gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-4-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 4, gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-5-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 5, gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-inverse-1-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-inverse-2-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
        ) ),
        'colour-accent-gradient-inverse-3-hex': renderColourAsHex( util.getGradientColour(
            palette[ 0 ], 1, 1 / gradientMultipliers[ theme ]
        ) ),

        // ── Secondary accent ─────────────────────────────────────────────
        'colour-accent-2-hex': renderColourAsHex( palette[ 1 ] ),
        'colour-accent-2-rgb': renderColourAsRGB( palette[ 1 ] ),
        'colour-accent-2-rgba-07': renderColourAsRGBA( palette[ 1 ], 0.7 ),
        'colour-accent-2-rgba-05': renderColourAsRGBA( palette[ 1 ], 0.5 ),
        'colour-accent-2-rgba-03': renderColourAsRGBA( palette[ 1 ], 0.3 ),
        'colour-accent-2-rgba-02': renderColourAsRGBA( palette[ 1 ], 0.2 ),
        'colour-accent-2-rgba-015': renderColourAsRGBA( palette[ 1 ], 0.15 ),
        'colour-accent-2-rgba-01': renderColourAsRGBA( palette[ 1 ], 0.1 ),
        'colour-accent-2-hyprland': util.renderColourAsRGBAHex( palette[ 1 ], 0.8 ),

        // ── Tertiary accent ──────────────────────────────────────────────
        'colour-accent-3-hex': renderColourAsHex( palette[ 2 ] ),
        'colour-accent-3-rgb': renderColourAsRGB( palette[ 2 ] ),
        'colour-accent-3-hyprland': util.renderColourAsRGBAHex( palette[ 2 ], 0.8 ),

        // ── Background ───────────────────────────────────────────────────
        'colour-background-hex': renderColourAsHex( colours.background[ theme ] ),
        'colour-background-rgb': renderColourAsRGB( colours.background[ theme ] ),
        'colour-background-rgba': renderColourAsRGBA( colours.background[ theme ], 0.5 ),
        'colour-background-rgba-07': renderColourAsRGBA( colours.background[ theme ], 0.7 ),
        'colour-background-rgba-05': renderColourAsRGBA( colours.background[ theme ], 0.5 ),
        'colour-background-rgba-03': renderColourAsRGBA( colours.background[ theme ], 0.3 ),
        'colour-background-rgba-02': renderColourAsRGBA( colours.background[ theme ], 0.2 ),
        'colour-background-rgba-015': renderColourAsRGBA( colours.background[ theme ], 0.15 ),
        'colour-background-rgba-011': renderColourAsRGBA( colours.background[ theme ], 0.11 ),

        // ── Background Alternative ───────────────────────────────────────
        'colour-background-alternative-hex': renderColourAsHex( colours[ 'background-alternative' ][ theme ] ),
        'colour-background-alternative-rgb': renderColourAsRGB( colours[ 'background-alternative' ][ theme ] ),
        'colour-background-alternative-rgba-07': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.7 ),
        'colour-background-alternative-rgba-06': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.6 ),
        'colour-background-alternative-rgba-05': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.5 ),
        'colour-background-alternative-rgba-04': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.4 ),
        'colour-background-alternative-rgba-03': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.3 ),
        'colour-background-alternative-rgba-02': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.2 ),
        'colour-background-alternative-rgba-015': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.15 ),
        'colour-background-alternative-rgba-01': renderColourAsRGBA( colours[ 'background-alternative' ][ theme ], 0.1 ),

        // ── Background Tertiary ──────────────────────────────────────────
        'colour-background-tertiary-hex': renderColourAsHex( colours[ 'background-tertiary' ][ theme ] ),
        'colour-background-tertiary-rgb': renderColourAsRGB( colours[ 'background-tertiary' ][ theme ] ),
        'colour-background-tertiary-rgba-05': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.5 ),
        'colour-background-tertiary-rgba-02': renderColourAsRGBA( colours[ 'background-tertiary' ][ theme ], 0.2 ),

        // ── Shadow ───────────────────────────────────────────────────────
        'colour-shadow-hex': renderColourAsHex( colours.shadow[ theme ] ),
        'colour-shadow-rgb': renderColourAsRGB( colours.shadow[ theme ] ),
        'colour-shadow-hyprland': util.renderColourAsRGBHex( colours.shadow[ theme ] ),
        'colour-shadow-rgba-07': renderColourAsRGBA( colours.shadow[ theme ], 0.7 ),
        'colour-shadow-rgba-05': renderColourAsRGBA( colours.shadow[ theme ], 0.5 ),
        'colour-shadow-rgba-03': renderColourAsRGBA( colours.shadow[ theme ], 0.3 ),
        'colour-shadow-rgba-02': renderColourAsRGBA( colours.shadow[ theme ], 0.2 ),
        'colour-shadow-rgba-015': renderColourAsRGBA( colours.shadow[ theme ], 0.15 ),
        'colour-shadow-rgba-011': renderColourAsRGBA( colours.shadow[ theme ], 0.11 ),

        // ── Inactive ─────────────────────────────────────────────────────
        'colour-inactive-hex': renderColourAsHex( colours.inactive[ theme ] ),
        'colour-inactive-rgb': renderColourAsRGB( colours.inactive[ theme ] ),
        'colour-inactive-rgba-07': renderColourAsRGBA( colours.inactive[ theme ], 0.7 ),
        'colour-inactive-rgba-05': renderColourAsRGBA( colours.inactive[ theme ], 0.5 ),
        'colour-inactive-rgba-03': renderColourAsRGBA( colours.inactive[ theme ], 0.3 ),
        'colour-inactive-rgba-02': renderColourAsRGBA( colours.inactive[ theme ], 0.2 ),
        'colour-inactive-rgba-015': renderColourAsRGBA( colours.inactive[ theme ], 0.15 ),
        // ───────────────────────────────────────────────────────────────────
        'colour-inactive-background-hex': renderColourAsHex( colours[ 'inactive-background' ][ theme ] ),
        'colour-inactive-background-rgb': renderColourAsRGB( colours[ 'inactive-background' ][ theme ] ),
        'colour-inactive-background-hyprland': util.renderColourAsRGBHex( colours[ 'inactive-background' ][ theme ] ),
        'colour-inactive-background-rgba-07': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.7 ),
        'colour-inactive-background-rgba-05': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.5 ),
        'colour-inactive-background-rgba-04': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.4 ),
        'colour-inactive-background-rgba-03': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.3 ),
        'colour-inactive-background-rgba-02': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.2 ),
        'colour-inactive-background-rgba-015': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.15 ),
        'colour-inactive-background-rgba-01': renderColourAsRGBA( colours[ 'inactive-background' ][ theme ], 0.1 ),

        // ┌                                               ┐
        // │                     Fonts                     │
        // └                                               ┘
        'font-primary': fonts.primary[ theme ],
        'font-accent': fonts.accent[ theme ],
        'font-mono': fonts.mono[ theme ],

        // ┌                                               ┐
        // │                  Icon Theme                   │
        // └                                               ┘
        'icon-theme': iconTheme[ theme ],

        // ┌                                               ┐
        // │                  yazi theme                   │
        // └                                               ┘
        'yazi-theme': yaziThemes[ theme ],

        // ┌                                               ┐
        // │           Path to this repo on disk           │
        // └                                               ┘
        'path-to-dotfiles': __dirname.slice( 0, __dirname.length - 5 ),
    };
};


// ───────────────────────────────────────────────────────────────────
//          ╭───────────────────────────────────────────────╮
//          │               Theme definitions               │
//          ╰───────────────────────────────────────────────╯
// ───────────────────────────────────────────────────────────────────
const gradientMultipliers = {
    'nordic': 0.9,
    'deep-dark': 0.8,
    'material': 0.85,
    'light': 1.1,
    'bright': 1.15,
    'test': 0.75
};
const colours = {
    'foreground': {
        'nordic': [
            200,
            220,
            255
        ],
        'deep-dark': [
            230,
            230,
            230
        ],
        'material': [
            255,
            255,
            255
        ], // TODO: Will be calculated by material theme generator
        'light': [
            40,
            40,
            40
        ],
        'bright': [
            0,
            0,
            0
        ],
        'test': [
            0,
            0,
            0
        ],
    },
    'foreground-accent': {
        'nordic': [
            255,
            255,
            255
        ],
        'deep-dark': [
            255,
            255,
            255
        ],
        'material': [
            200,
            200,
            200
        ], // TODO: Will be calculated by material theme generator
        'light': [
            0,
            0,
            0
        ],
        'bright': [
            50,
            50,
            50
        ],
        'test': [
            0,
            0,
            0
        ],
    },
    'background': {
        'nordic': [
            10,
            10,
            15
        ],
        'deep-dark': [
            20,
            20,
            20
        ],
        'material': [
            30,
            30,
            30
        ], // TODO: Will be calculated by material theme generator
        'light': [
            230,
            230,
            230
        ],
        'bright': [
            255,
            255,
            255
        ],
        'test': [
            255,
            255,
            255
        ],
    },
    'background-alternative': {
        'nordic': [
            20,
            20,
            25
        ],
        'deep-dark': [
            30,
            30,
            30
        ],
        'material': [
            40,
            40,
            40
        ], // TODO: Will be calculated by material theme generator
        'light': [
            210,
            210,
            210
        ],
        'bright': [
            230,
            230,
            230
        ],
        'test': [
            255,
            255,
            0
        ] // brown
    },
    'background-tertiary': {
        'nordic': [
            0,
            0,
            0
        ],
        'deep-dark': [
            45,
            45,
            45
        ],
        'material': [
            0,
            0,
            0
        ], // TODO: Will be calculated by material theme generator
        'light': [
            180,
            180,
            180
        ],
        'bright': [
            200,
            200,
            200
        ],
        'test': [
            255,
            0,
            255
        ] // purple
    },
    'shadow': {
        'nordic': [
            0,
            0,
            2
        ],
        'deep-dark': [
            40,
            40,
            40
        ],
        'material': [
            30,
            30,
            30
        ], // TODO: Will be calculated by material theme generator
        'light': [
            190,
            190,
            190
        ],
        'bright': [
            150,
            150,
            150
        ],
        'test': [
            120,
            0,
            0
        ] // dark red
    },
    'inactive': {
        'nordic': [
            200,
            200,
            200
        ],
        'deep-dark': [
            200,
            200,
            200
        ],
        'material': [
            200,
            200,
            200
        ], // TODO: Will be calculated by material theme generator
        'light': [
            65,
            65,
            65
        ],
        'bright': [
            60,
            60,
            60
        ],
        'test': [
            150,
            150,
            150
        ]
    },
    'inactive-background': {
        'nordic': [
            0,
            0,
            0
        ],
        'deep-dark': [
            0,
            0,
            0
        ],
        'material': [
            255,
            255,
            255
        ], // TODO: Will be calculated by material theme generator
        'light': [
            80,
            80,
            80
        ],
        'bright': [
            60,
            60,
            60
        ],
        'test': [
            60,
            60,
            60
        ]
    }
};
const fonts = {
    'primary': {
        'nordic': 'Comfortaa',
        'deep-dark': 'Comfortaa',
        'material': 'Comfortaa',
        'light': 'Adwaita Sans',
        'bright': 'Adwaita Sans Extralight'
    },
    'accent': {
        'nordic': 'Adwaita Sans',
        'deep-dark': 'Adwaita Sans',
        'material': 'Adwaita Sans',
        'light': 'Cantarell',
        'bright': 'Contarell Thin'
    },
    'mono': {
        'nordic': 'Source Code Pro',
        'deep-dark': 'Source Code Pro',
        'material': 'Source Code Pro',
        'light': 'Jetbrains Mono',
        'bright': 'Jetbrains Mono',
    }
};
const iconTheme = {
    'nordic': 'Candy',
    'deep-dark': 'Candy',
    'material': 'Candy',
    'light': 'Candy',
    'bright': 'Candy'
};
const yaziThemes = {
    'nordic': 'tokyo-night',
    'deep-dark': 'vscode-dark-modern',
    'material': 'dracula',
    'light': 'vscode-light-modern',
    'bright': 'vscode-light-modern',
};
