import { makeStyles } from "@material-ui/core";
import { useTheme } from "@material-ui/core/styles";
import AvailabilityFilter from "./AvailabilityFilter";
import Button from "@material-ui/core/Button";
import Drawer from "@material-ui/core/Drawer";
import Grid from "@material-ui/core/Grid";
import RadiusFilter from "./RadiusFilter";
import React, { useState } from "react";
import Typography from "@material-ui/core/Typography";
import useMediaQuery from "@material-ui/core/useMediaQuery";
import ZipCodeFilter, { isZipValid } from "./ZipCodeFilter";
import { useTranslation } from "react-i18next";

const leftPaddingSpacingCoefficient = 1.0;

const useStyles = makeStyles((theme) => ({
    mdPanel: {
        position: "sticky",
        top: 0,
        height: "200px",
    },
    drawerPaper: {
        width: theme.drawerWidth,
        [theme.breakpoints.up("md")]: {
            top: "70px",
            height: "calc(100% - 70px)",
            border: "none",
        },
        [theme.breakpoints.down("sm")]: {
            top: 0,
            height: "100% ",
            borderRight: "1px solid rgba(0, 0, 0, 0.12)",
        },
    },
    filterGroup: {
        "border-style": "solid",
        "border-color": theme.palette.divider,
        "margin-left": theme.spacing(leftPaddingSpacingCoefficient / 2),
        "padding-left": theme.spacing(leftPaddingSpacingCoefficient / 2),
        width: "90%",
    },
    filterSegment: {
        "padding-top": theme.spacing(1),
        "padding-bottom": theme.spacing(1),
        "padding-left": theme.spacing(0.5),
    },
    panel: {
        "padding-left": theme.spacing(leftPaddingSpacingCoefficient),
    },
}));

function ClearFilters({ classes, inProgressFilters, setInProgressFilters }) {
    const { t } = useTranslation("main");
    return (
        <Button
            variant="outlined"
            color="default"
            className={classes.mobileButton}
            onClick={(e) => {
                e.preventDefault();
                setInProgressFilters({
                    ...inProgressFilters,
                    filterByAvailable: true,
                    filterByZipCode: {
                        ...inProgressFilters.filterByZipCode,
                        zipCode: "",
                        miles: 9999,
                    },
                });
            }}
            type="submit"
        >
            {t("filter.clear_filters")}
        </Button>
    );
}

export default function FilterPanelParent({
    mainContainer,
    anchor,
    mobileOpen,
    handleDrawerToggle,
    filters,
    setFilters,
}) {
    const { t } = useTranslation("main");
    const classes = useStyles();
    const theme = useTheme();
    const mdSize = useMediaQuery(theme.breakpoints.up("md"));

    const [inProgressFilters, setInProgressFilters] = useState({ ...filters });
    return !mdSize ? (
        <>
            <Drawer
                container={mainContainer}
                variant="temporary"
                anchor={anchor}
                open={mobileOpen}
                onClose={handleDrawerToggle}
                classes={{
                    paper: classes.drawerPaper,
                }}
                ModalProps={{
                    keepMounted: true, // Better open performance on mobile.
                }}
            >
                <FilterPanel
                    filters={inProgressFilters}
                    setFilters={setInProgressFilters}
                    closeButton={
                        <Button
                            data-testid="apply-filters-button"
                            variant="contained"
                            color="primary"
                            onClick={(e) => {
                                handleDrawerToggle(e);
                                setFilters(inProgressFilters);
                            }}
                            type="submit"
                        >
                            {t("filter.apply_filters")}
                        </Button>
                    }
                    clearButton={
                        <ClearFilters
                            inProgressFilters={inProgressFilters}
                            setInProgressFilters={setInProgressFilters}
                            classes={classes}
                        />
                    }
                    isMobile
                />
            </Drawer>
        </>
    ) : (
        <>
            <Drawer
                classes={{
                    paper: classes.drawerPaper,
                }}
                variant="permanent"
                open
            >
                <FilterPanel
                    filters={inProgressFilters}
                    setFilters={setInProgressFilters}
                    closeButton={
                        <Button
                            data-testid="apply-filters-button"
                            variant="contained"
                            color="primary"
                            className={classes.mobileButton}
                            onClick={() => setFilters(inProgressFilters)}
                            disabled={
                                !!(
                                    inProgressFilters.filterByZipCode.zipCode &&
                                    !isZipValid(
                                        inProgressFilters.filterByZipCode
                                            .zipCode
                                    )
                                )
                            }
                            type="submit"
                        >
                            {t("filter.apply_filters")}
                        </Button>
                    }
                    clearButton={
                        <ClearFilters
                            inProgressFilters={inProgressFilters}
                            setInProgressFilters={setInProgressFilters}
                            classes={classes}
                        />
                    }
                />
            </Drawer>
        </>
    );
}

export function FilterSegment({ children }) {
    const classes = useStyles();
    return (
        <Grid item xs={12} className={classes.filterSegment}>
            {children}
        </Grid>
    );
}

export function FilterGroup({ name, children }) {
    const classes = useStyles();
    return (
        <div className={classes.filterGroup}>
            <div className={classes.filterSegment}>
                <strong>{name}</strong>
            </div>
            {children}
        </div>
    );
}

function FilterPanel(props) {
    const { filters, setFilters, closeButton, clearButton, isMobile } = props;
    const { t } = useTranslation("main");

    const classes = useStyles();
    const theme = useTheme();
    const mdSize = useMediaQuery(theme.breakpoints.up("md"));

    return (
        <Grid
            container={true}
            className={`${classes.panel} ${mdSize ? classes.mdPanel : ""}`}
        >
            {isMobile && (
                <Typography variant="h6" component="span">
                    {t("filter.heading")}
                </Typography>
            )}
            <form onSubmit={(e) => e.preventDefault()}>
                <FilterSegment>
                    <AvailabilityFilter
                        onlyShowAvailable={filters.filterByAvailable}
                        onChange={(value) =>
                            setFilters({
                                ...filters,
                                filterByAvailable: value,
                            })
                        }
                    />
                </FilterSegment>
                <FilterGroup name={t("filter.find_locations")}>
                    <FilterSegment>
                        <ZipCodeFilter
                            zipCode={filters.filterByZipCode.zipCode}
                            onChange={(zip) =>
                                setFilters({
                                    ...filters,
                                    filterByZipCode: {
                                        ...filters.filterByZipCode,
                                        zipCode: zip,
                                    },
                                })
                            }
                        />
                    </FilterSegment>
                    <FilterSegment>
                        <RadiusFilter
                            value={filters.filterByZipCode.miles}
                            onChange={(miles) =>
                                setFilters({
                                    ...filters,
                                    filterByZipCode: {
                                        ...filters.filterByZipCode,
                                        miles,
                                    },
                                })
                            }
                        />
                    </FilterSegment>
                </FilterGroup>
                <FilterSegment>
                    {closeButton} {clearButton}
                </FilterSegment>
            </form>
        </Grid>
    );
}