import {cloneElement, isValidElement} from 'react';
import {RouteComponentProps} from 'react-router';

import * as AppStoreConnectContext from 'sentry/components/projects/appStoreConnectContext';
import {Organization, Project} from 'sentry/types';
import useRouteAnalyticsParams from 'sentry/utils/routeAnalytics/useRouteAnalyticsParams';
import withOrganization from 'sentry/utils/withOrganization';
import ProjectContext from 'sentry/views/projects/projectContext';
import SettingsLayout from 'sentry/views/settings/components/settingsLayout';
import ProjectSettingsNavigation from 'sentry/views/settings/project/projectSettingsNavigation';

type Props = {
  children: React.ReactNode;
  organization: Organization;
} & RouteComponentProps<{projectId: string}, {}>;

type InnerProps = Props & {project: Project};

function InnerProjectSettingsLayout({
  params,
  routes,
  project,
  organization,
  children,
  ...props
}: InnerProps) {
  // set analytics params for route based analytics
  useRouteAnalyticsParams({
    project_id: project.id,
    project_platform: project.platform,
  });
  return (
    <AppStoreConnectContext.Provider project={project} organization={organization}>
      <SettingsLayout
        params={params}
        routes={routes}
        {...props}
        renderNavigation={() => <ProjectSettingsNavigation organization={organization} />}
      >
        {children && isValidElement(children)
          ? cloneElement<any>(children, {organization, project})
          : children}
      </SettingsLayout>
    </AppStoreConnectContext.Provider>
  );
}

function ProjectSettingsLayout({organization, params, ...props}: Props) {
  return (
    <ProjectContext orgId={organization.slug} projectId={params.projectId}>
      {({project}) => (
        <InnerProjectSettingsLayout {...{params, project, organization, ...props}} />
      )}
    </ProjectContext>
  );
}

export default withOrganization(ProjectSettingsLayout);