import React from 'react';

import Icon from 'components/Icon';
import JobListItem from 'components/JobListItem';
import Pagination from 'components/Pagination';

import { isNully } from 'utils/Common';
import { TASK_COUNTS } from 'utils/Job';

// VisibleForTesting
export function searchJob(job, query) {
  const taskConfig = job.job.taskConfig;
  const jobType = taskConfig.isService ? 'service' : job.job.cronSchedule ? 'cron' : 'adhoc';
  return (job.job.key.name.includes(query) ||
    taskConfig.tier.startsWith(query) ||
    job.job.key.environment.startsWith(query) ||
    jobType.startsWith(query));
}

export function JobListSortControl({ onClick }) {
  return (<ul className='job-task-stats job-list-sort-control'>
    <li>sort by:</li>
    {TASK_COUNTS.map((key) => {
      const label = key.replace('TaskCount', '');
      return (<li key={key} onClick={(e) => onClick(key)}>
        <span className={`img-circle ${label}-task`} /> {label}
      </li>);
    })}
  </ul>);
}

export default class JobList extends React.Component {
  constructor(props) {
    super(props);
    this.state = {filter: props.filter, sortBy: props.sortBy};
  }

  setFilter(e) {
    this.setState({filter: e.target.value});
  }

  setSort(sortBy) {
    this.setState({sortBy});
  }

  render() {
    const that = this;
    const sortFn = this.state.sortBy ? (j) => j.stats[that.state.sortBy] : (j) => j.job.key.name;
    const filterFn = (j) => that.state.filter ? searchJob(j, that.state.filter) : true;
    return (<div className='job-list'>
      <div className='table-input-wrapper'>
        <Icon name='search' />
        <input
          autoFocus
          onChange={(e) => this.setFilter(e)}
          placeholder='Search jobs by name, environment, type or tier'
          type='text' />
      </div>
      <JobListSortControl onClick={(key) => this.setSort(key)} />
      <table className='psuedo-table'>
        <Pagination
          data={this.props.jobs}
          filter={filterFn}
          hideIfSinglePage
          isTable
          numberPerPage={25}
          renderer={(job) => <JobListItem
            env={that.props.env}
            job={job}
            key={`${job.job.key.environment}/${job.job.key.name}`} />}
          // Always sort task count sorts in descending fashion (for UX reasons)
          reverseSort={!isNully(this.state.sortBy)}
          sortBy={sortFn} />
      </table>
    </div>);
  }
}
