import {
    type ViewStyle,
    type TextStyle,
    StyleSheet
} from "react-native";
import {
    type TextInputDynamicStyleType,
    type TextInputTypes,
    type TextInputType
} from "./type";
import type {
    Mutable
} from "../../types";

export const TEXT_INPUT_TYPE_STYLES: Record<
    TextInputType,
    TextInputTypes
> = {
    default: {
        focusBorderColor: "emphasized",
        borderColor: "emphasized",
        hintTextIconColor: "mid",
        placeholderColor: "low",
        containerColor: "mid",
        hintTextColor: "mid",
        titleColor: "high",
        inputColor: "mid",
        iconColor: "mid"
    },
    question: {
        focusBorderColor: "emphasized",
        borderColor: "emphasized",
        hintTextIconColor: "mid",
        placeholderColor: "low",
        containerColor: "mid",
        hintTextColor: "mid",
        titleColor: "mid",
        inputColor: "mid",
        iconColor: "mid"
    },
    success: {
        placeholderColor: "successLow",
        hintTextIconColor: "success",
        focusBorderColor: "success",
        containerColor: "success",
        hintTextColor: "success",
        borderColor: "success",
        titleColor: "success",
        inputColor: "success",
        iconColor: "success"
    },
    warning: {
        placeholderColor: "warningLow",
        hintTextIconColor: "warning",
        focusBorderColor: "warning",
        containerColor: "warning",
        hintTextColor: "warning",
        borderColor: "warning",
        titleColor: "warning",
        inputColor: "warning",
        iconColor: "warning"
    },
    danger: {
        placeholderColor: "dangerLow",
        hintTextIconColor: "danger",
        focusBorderColor: "danger",
        containerColor: "danger",
        hintTextColor: "danger",
        borderColor: "danger",
        titleColor: "danger",
        inputColor: "danger",
        iconColor: "danger"
    },
    info: {
        placeholderColor: "infoLow",
        hintTextIconColor: "info",
        focusBorderColor: "info",
        containerColor: "info",
        hintTextColor: "info",
        borderColor: "info",
        titleColor: "info",
        inputColor: "info",
        iconColor: "info"
    }
};

export const getTextInputType = ({
    type
}: {
    type: TextInputType;
}) => {
    const currentType = TEXT_INPUT_TYPE_STYLES[type];

    return currentType;
};

const stylesheet = StyleSheet.create({
    input: {
        backgroundColor: "transparent",
        textAlignVertical: "center",
        borderColor: "transparent",
        paddingBottom: 0,
        paddingRight: 0,
        paddingLeft: 0,
        borderWidth: 0,
        paddingTop: 0,
        minHeight: 20,
        zIndex: 99,
        flex: 1
    },
    hideTextIconContainer: {
        justifyContent: "center",
        alignItems: "center",
        alignSelf: "center",
        display: "flex",
        zIndex: 99,
        height: 18
    },
    cleanButton: {
        justifyContent: "center",
        alignItems: "center",
        alignSelf: "center",
        display: "flex",
        zIndex: 99
    },
    rightIcon: {
        justifyContent: "center",
        alignItems: "center",
        alignSelf: "center",
        display: "flex",
        zIndex: 99
    },
    icon: {
        justifyContent: "center",
        alignContent: "center",
        alignItems: "center",
        display: "flex",
        zIndex: 99
    },
    content: {
        boxSizing: "border-box",
        flexDirection: "row",
        borderStyle: "solid",
        alignItems: "center",
        position: "relative",
        display: "flex",
        minWidth: 200
    },
    container: {
        flexDirection: "column",
        boxSizing: "border-box",
        alignSelf: "auto",
        display: "flex"
    },
    hintText: {
        flexDirection: "row",
        alignItems: "center",
        display: "flex"
    },
    titleContainer: {
        flexDirection: "row",
        alignItems: "center"
    },
    overlay: {
        position: "absolute",
        zIndex: 98
    },
    hintTextIcon: {
    },
    required: {
    },
    subTitle: {
    },
    title: {
    }
});

export const useStyles = ({
    customBorderColor,
    spreadBehaviour,
    inlineSpaces,
    currentType,
    customColor,
    isDisabled,
    typography,
    isFocused,
    radiuses,
    borders,
    colors,
    spaces,
    type
}: TextInputDynamicStyleType) => {
    const styleType = type === "danger" ? "error" : type === "question" ? "neutral" : type;

    const styles = {
        content: {
            backgroundColor: colors.content.container[currentType.containerColor],
            borderColor: colors.content.container[currentType.containerColor],
            paddingBottom: spaces.spacingMd,
            paddingRight: spaces.spacingMd,
            borderRadius: radiuses.actions,
            paddingLeft: spaces.spacingMd,
            paddingTop: spaces.spacingMd,
            borderWidth: borders.line
        } as Mutable<ViewStyle>,
        input: {
            ...typography.labelLargeSize,
            color: colors.content.text[currentType.inputColor]
        } as Mutable<TextStyle>,
        overlay: {
            borderRadius: radiuses.actions - 1,
            bottom: -borders.line,
            right: -borders.line,
            left: -borders.line,
            top: -borders.line
        } as Mutable<ViewStyle>,
        required: {
            marginRight: inlineSpaces.required
        } as Mutable<ViewStyle>,
        subTitle: {
            marginLeft: inlineSpaces.subTitle
        } as Mutable<TextStyle>,
        titleContainer: {
            marginBottom: spaces.spacingSm
        } as Mutable<ViewStyle>,
        hintTextIcon: {
            marginRight: spaces.spacingXs
        } as Mutable<ViewStyle>,
        icon: {
            marginRight: spaces.spacingSm
        } as Mutable<ViewStyle>,
        hideTextIconContainer: {
            marginLeft: spaces.spacingSm
        } as Mutable<ViewStyle>,
        cleanButton: {
            marginLeft: spaces.spacingSm
        } as Mutable<ViewStyle>,
        rightIcon: {
            marginLeft: spaces.spacingSm
        } as Mutable<ViewStyle>,
        hintText: {
            marginTop: spaces.spacingSm
        } as Mutable<TextStyle>,
        container: {
        } as Mutable<ViewStyle>,
        title: {
        } as Mutable<TextStyle>
    };

    if(isDisabled) {
        const disableStyleType = styleType === "default" ? "neutral" : styleType;

        styles.overlay.backgroundColor = colors.system.state.overlay.disabled[disableStyleType];
        styles.container.borderColor = colors.system.state.overlay.disabled[disableStyleType];

        styles.input.color = colors.content.text.disabled;
    }

    if (spreadBehaviour === "baseline") {
        styles.container.alignSelf = spreadBehaviour;
        styles.container.width = "auto";
    }

    if (spreadBehaviour === "stretch") {
        styles.container.alignSelf = spreadBehaviour;
        styles.container.justifyContent = "center";
        styles.container.flexShrink = 1;
        styles.container.width = "100%";
    }

    if(customBorderColor) {
        styles.content.borderColor = customBorderColor;
    }

    if(isFocused && !isDisabled) {
        if(type === "question" || type === "default") {
            styles.content.borderColor = colors.content.border.emphasized;
        } else {
            styles.content.borderColor = colors.content.border[type];
        }
    }

    if(customColor) {
        styles.content.backgroundColor = customColor;
    }

    return styles;
};
export default stylesheet;
