import {browserHistory} from 'react-router';
import styled from '@emotion/styled';
import {Location} from 'history';

import Breadcrumbs, {Crumb, CrumbDropdown} from 'app/components/breadcrumbs';
import IdBadge from 'app/components/idBadge';
import {t} from 'app/locale';
import space from 'app/styles/space';
import {Project} from 'app/types';
import {isActiveSuperuser} from 'app/utils/isActiveSuperuser';
import recreateRoute from 'app/utils/recreateRoute';
import withProjects from 'app/utils/withProjects';
import MenuItem from 'app/views/settings/components/settingsBreadcrumb/menuItem';
import {RouteWithName} from 'app/views/settings/components/settingsBreadcrumb/types';

type Props = {
  orgSlug: string;
  title: string;
  projectSlug: string;
  projects: Project[];
  routes: RouteWithName[];
  location: Location;
  alertName?: string;
  canChangeProject?: boolean;
};

function BuilderBreadCrumbs(props: Props) {
  const {
    orgSlug,
    title,
    alertName,
    projectSlug,
    projects,
    routes,
    canChangeProject,
    location,
  } = props;
  const project = projects.find(({slug}) => projectSlug === slug);
  const isSuperuser = isActiveSuperuser();

  const projectCrumbLink = {
    to: `/organizations/${orgSlug}/alerts/rules/?project=${project?.id}`,
    label: <IdBadge project={project} avatarSize={18} disableLink />,
    preserveGlobalSelection: true,
  };
  const projectCrumbDropdown = {
    onSelect: ({value}) => {
      browserHistory.push(
        recreateRoute('', {
          routes,
          params: {orgId: orgSlug, projectId: value},
          location,
        })
      );
    },
    label: <IdBadge project={project} avatarSize={18} disableLink />,
    items: projects
      .filter(proj => proj.isMember || isSuperuser)
      .map((proj, index) => ({
        index,
        value: proj.slug,
        label: (
          <MenuItem>
            <IdBadge
              project={proj}
              avatarProps={{consistentWidth: true}}
              avatarSize={18}
              disableLink
            />
          </MenuItem>
        ),
        searchKey: proj.slug,
      })),
  };
  const projectCrumb = canChangeProject ? projectCrumbDropdown : projectCrumbLink;

  const crumbs: (Crumb | CrumbDropdown)[] = [
    {
      to: `/organizations/${orgSlug}/alerts/rules/`,
      label: t('Alerts'),
      preserveGlobalSelection: true,
    },
    projectCrumb,
    {
      label: title,
      ...(alertName
        ? {
            to: `/organizations/${orgSlug}/alerts/${projectSlug}/wizard`,
            preserveGlobalSelection: true,
          }
        : {}),
    },
  ];
  if (alertName) {
    crumbs.push({label: alertName});
  }

  return <StyledBreadcrumbs crumbs={crumbs} />;
}

const StyledBreadcrumbs = styled(Breadcrumbs)`
  font-size: 18px;
  margin-bottom: ${space(3)};
`;

export default withProjects(BuilderBreadCrumbs);