import React, { useState } from 'react';

import { Section, Component } from '../guide/components';
import { View, Text } from './common';
import {
  TableWithNavigator as Table,
  Row,
  Cell,
  InputCell,
  useTableNavigator
} from './table';

let uuid = require('loot-core/src/platform/uuid');

function PersonRow({ person, editing, focusedField, onEdit, onUpdate }) {
  let { id } = person;
  return (
    <Row style={{ width: 500 }} borderColor="#f0f0f0" collapsed={true}>
      <InputCell
        width="flex"
        value={person.name}
        exposed={focusedField === 'name'}
        onUpdate={value => onUpdate(id, 'name', value)}
        onExpose={() => onEdit(id, 'name')}
      />
      {person.poop ? (
        <InputCell
          width="100"
          value={person.poop}
          exposed={focusedField === 'poop'}
          onUpdate={value => onUpdate(id, 'poop', value)}
          onExpose={() => onEdit(id, 'poop')}
        />
      ) : (
        <Cell width="100" />
      )}
      <InputCell
        width="100"
        value={person.age}
        exposed={focusedField === 'age'}
        onUpdate={value => onUpdate(id, 'age', value)}
        onExpose={() => onEdit(id, 'age')}
      />
      <InputCell
        width="100"
        value={person.height}
        exposed={focusedField === 'height'}
        onUpdate={value => onUpdate(id, 'height', value)}
        onExpose={() => onEdit(id, 'height')}
      />
    </Row>
  );
}

let people = [
  { id: 1, name: 'James', age: 34, height: 6 },
  { id: 2, name: 'Sarah', poop: 1, age: 33, height: 5.6 },
  { id: 3, name: 'Evy', age: 4, height: 3 },
  { id: 4, name: 'Georgia', poop: 2, age: 3, height: 2.5 },
  { id: 5, name: 'Charlotte', age: 0, height: 1.2 }
];

let getFields = item =>
  item.poop ? ['name', 'poop', 'age', 'height'] : ['name', 'age', 'height'];

export default () => (
  <Section>
    Input Cell Example
    <Component>
      {() => {
        let [value, setValue] = useState('hello');
        let [exposed, setExposed] = useState(false);

        return (
          <View style={{ backgroundColor: 'white', width: 200 }}>
            <InputCell
              value={value}
              exposed={exposed}
              onUpdate={value => setValue(value)}
              onExpose={() => setExposed(true)}
              onBlur={() => setExposed(false)}
              style={{ height: 30 }}
            />
            <Text style={{ padding: 10 }}>{value}</Text>
          </View>
        );
      }}
    </Component>
    Multiple Cells
    <Component>
      {() => {
        let [items, setItems] = useState(() => {
          return [...people];
        });
        let {
          onEdit,
          editingId,
          focusedField,
          getNavigatorProps
        } = useTableNavigator(items, getFields);

        function onUpdate(id, name, value) {
          let idx = items.findIndex(item => item.id === id);
          items[idx] = { ...items[idx], [name]: value };
          setItems(items);
        }

        return (
          <View
            style={{ backgroundColor: 'white', width: 500 }}
            {...getNavigatorProps()}
          >
            {items.map(item => {
              let editing = editingId === item.id;
              return (
                <PersonRow
                  person={item}
                  editing={editing}
                  focusedField={editing && focusedField}
                  onEdit={onEdit}
                  onUpdate={onUpdate}
                />
              );
            })}
          </View>
        );
      }}
    </Component>
    Using Table
    <Component>
      {() => {
        let [items, setItems] = useState(() => {
          let lots = [];
          for (let i = 0; i < 100; i++) {
            lots = lots.concat(
              people.map(person => ({ ...person, id: uuid.v4Sync() }))
            );
          }
          return lots;
        });

        function onUpdate(id, name, value) {
          let idx = items.findIndex(item => item.id === id);
          items[idx] = { ...items[idx], [name]: value };
          setItems(items);
        }

        return (
          <Table
            items={items}
            fields={getFields}
            style={{ width: 500, height: 200 }}
            renderItem={({ props, item, editing, focusedField, onEdit }) => (
              <PersonRow
                person={item}
                editing={editing}
                focusedField={focusedField}
                onEdit={onEdit}
                onUpdate={onUpdate}
              />
            )}
          />
        );
      }}
    </Component>
  </Section>
);