/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @format
 * @flow
 */

'use strict';

const React = require('react');
const ReactNative = require('react-native');
const {DatePickerIOS, StyleSheet, Text, View} = ReactNative;

type State = {|
  date: Date,
|};

type Props = {|
  children: (State, (Date) => void) => React.Node,
|};

class WithDatePickerData extends React.Component<Props, State> {
  state = {
    date: new Date(),
  };

  onDateChange = date => {
    this.setState({date: date});
  };

  render() {
    return (
      <View>
        <WithLabel label="Value:">
          <Text testID="date-indicator">
            {this.state.date.toLocaleDateString()}
          </Text>
          <Text testID="time-indicator">
            {this.state.date.toLocaleTimeString([], {
              hour: '2-digit',
              minute: '2-digit',
            })}
          </Text>
        </WithLabel>
        {this.props.children(this.state, this.onDateChange)}
      </View>
    );
  }
}

type LabelProps = {|
  label: string,
  children: React.Node,
|};

class WithLabel extends React.Component<LabelProps> {
  render() {
    return (
      <View style={styles.labelContainer}>
        <View style={styles.labelView}>
          <Text style={styles.label}>{this.props.label}</Text>
        </View>
        {this.props.children}
      </View>
    );
  }
}

const styles = StyleSheet.create({
  textinput: {
    height: 26,
    width: 50,
    borderWidth: 0.5,
    borderColor: '#0f0f0f',
    padding: 4,
    fontSize: 13,
  },
  labelContainer: {
    flexDirection: 'row',
    alignItems: 'center',
    marginVertical: 2,
  },
  labelView: {
    marginRight: 10,
    paddingVertical: 2,
  },
  label: {
    fontWeight: '500',
  },
});

exports.title = '<DatePickerIOS>';
exports.description = 'Select dates and times using the native UIDatePicker.';
exports.examples = [
  {
    title: 'Date and time picker',
    render: function(): React.Element<any> {
      return (
        <WithDatePickerData>
          {(state, onDateChange) => (
            <DatePickerIOS
              testID="date-and-time"
              date={state.date}
              mode="datetime"
              onDateChange={onDateChange}
            />
          )}
        </WithDatePickerData>
      );
    },
  },
  {
    title: 'Date only picker',
    render: function(): React.Element<any> {
      return (
        <WithDatePickerData>
          {(state, onDateChange) => (
            <DatePickerIOS
              testID="date-only"
              date={state.date}
              mode="date"
              onDateChange={onDateChange}
            />
          )}
        </WithDatePickerData>
      );
    },
  },
  {
    title: 'Picker with 20-minute interval',
    render: function(): React.Element<any> {
      return (
        <WithDatePickerData>
          {(state, onDateChange) => (
            <DatePickerIOS
              testID="date-and-time-with-interval"
              date={state.date}
              minuteInterval={20}
              mode="datetime"
              onDateChange={onDateChange}
            />
          )}
        </WithDatePickerData>
      );
    },
  },
];