import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { StyleSheet, View, TouchableOpacity } from 'react-native'

import AppText from '../common/app-text'
import DripIcon from '../../assets/drip-icons'
import SymptomEditView from './symptom-edit-view'

import { connect } from 'react-redux'
import { getDate } from '../../slices/date'
import { isDateInFuture } from '../helpers/cycle-day'

import { Colors, Sizes, Spacing } from '../../styles'
import { headerTitles as symptomTitles } from '../../i18n/en/labels'

class SymptomBox extends Component {

  static propTypes = {
    date: PropTypes.string.isRequired,
    isSymptomEdited: PropTypes.bool,
    symptom: PropTypes.string.isRequired,
    symptomData: PropTypes.object,
    symptomDataToDisplay: PropTypes.string,
    updateCycleDayData: PropTypes.func.isRequired,
  }

  static defaultProps = {
    isSymptomEdited: false,
  }

  constructor(props) {
    super(props)

    this.state = {
      isSymptomEdited: props.isSymptomEdited
    }
  }

  onFinishEditing = () => {
    const { date, updateCycleDayData } = this.props

    updateCycleDayData(date)
    this.setState({ isSymptomEdited: false })
  }

  onEditSymptom = () => {
    this.setState({ isSymptomEdited: true })
  }

  render() {
    const { date, symptom, symptomData, symptomDataToDisplay } = this.props
    const { isSymptomEdited } = this.state
    const isSymptomDisabled = isDateInFuture(date) && symptom !== 'note'
    const isExcluded = symptomData !== null ? symptomData.exclude : false

    const iconColor = isSymptomDisabled ? Colors.greyLight : Colors.grey
    const iconName = `drip-icon-${symptom}`
    const symptomNameStyle = [
      styles.symptomName,
      (isSymptomDisabled && styles.symptomNameDisabled),
      (isExcluded && styles.symptomNameExcluded)
    ]
    const textStyle = [
      styles.text,
      (isSymptomDisabled && styles.textDisabled),
      (isExcluded && styles.textExcluded)
    ]

    return (
      <React.Fragment>
        {isSymptomEdited &&
          <SymptomEditView
            symptom={symptom}
            symptomData={symptomData}
            onClose={this.onFinishEditing}
          />
        }

        <TouchableOpacity
          disabled={isSymptomDisabled}
          onPress={this.onEditSymptom}
          style={styles.container}
          testID={iconName}
        >
          <DripIcon
            color={iconColor}
            isActive={!isSymptomDisabled}
            name={iconName}
            size={40}
          />
          <View style={styles.textContainer}>
            <AppText style={symptomNameStyle}>
              {symptomTitles[symptom].toLowerCase()}
            </AppText>
            {symptomDataToDisplay &&
              <AppText style={textStyle} numberOfLines={4}>
                {symptomDataToDisplay}
              </AppText>
            }
          </View>
        </TouchableOpacity>
      </React.Fragment>
    )
  }
}

const hint = {
  fontSize: Sizes.small,
  fontStyle: 'italic'
}

const main = {
  fontSize: Sizes.base,
  height: Sizes.base * 2,
  lineHeight: Sizes.base,
  marginBottom: (-1) * Sizes.tiny,
  textAlignVertical: 'center'
}

const styles = StyleSheet.create({
  container: {
    alignItems: 'center',
    backgroundColor: 'white',
    borderRadius: 10,
    elevation: 4,
    flexDirection: 'row',
    height: 110,
    marginBottom: Spacing.base,
    paddingHorizontal: Spacing.small,
    paddingVertical: Spacing.base,
    width: Spacing.symptomTileWidth
  },
  symptomName: {
    color: Colors.purple,
    ...main
  },
  symptomNameDisabled: {
    color: Colors.grey
  },
  symptomNameExcluded: {
    color: Colors.greyDark,
  },
  textContainer: {
    flexDirection: 'column',
    marginLeft: Spacing.small,
    maxWidth: Spacing.textWidth
  },
  text: {
    ...hint
  },
  textDisabled: {
    color: Colors.greyLight
  },
  textExcluded: {
    color: Colors.grey,
  }
})

const mapStateToProps = (state) => {
  return({
    date: getDate(state),
  })
}

export default connect(
  mapStateToProps,
  null,
)(SymptomBox)