import React from 'react';
import axios from 'axios';
import { FaStar } from 'react-icons/fa';
import styled from 'styled-components';
import ReviewsHeader from './ReviewsHeader.jsx';
import ReviewsForItem from './ReviewsForItems.jsx';
import ReviewsForShop from './ReviewsForShop.jsx';
import ReviewsPhotoCarousel from './ReviewsPhotoCarousel.jsx';
import ReviewsModal from './ReviewsModal.jsx'
import Pagination from './Pagination.jsx';

const ReviewsContainer = styled.div`
    font-family: 'Roboto', sans-serif;
    display:flex;
    flex-direction: column;
    margin: 0px 50px 0px 30px;
    max-width: 850px;
    .reviews-userphoto {
      vertical-align: middle;
      margin: 0px 12px 0px 0px;
      border-radius: 50%;
      overflow: hidden;
      height: 36px;
      width: 36px;
    }
    .reviews-usertitle {
      align-self: center;
      margin: 0px 0px 6px;
    }
    #review-username {
      font-size: 13px;
      line-height: 18px;
      margin: 0px 6px 0px 0px;
      color: #595959;
      text-decoration: underline;
      transition: opacity 200ms ease-out;
    }
    #review-date {
      vertical-align: middle;
      font-size: 13px;
      line-height: 18px;
      color: #595959;
    }
    .review-rating-pic {
      display:flex;
      justify-content:flex-start;
    }
    .review-rating-text {
      justify-self: space-around;
      flex-direction:row;
      align-self: flex-start;
      padding: 0px 0px 0px 48px;
      width: 100%;
    }
    #review-stars {
      font-size: 18px;
      margin: 0px 0px 6px;
    }
    .review-style {
      font-size: 13px;
      line-height: 18px;
      font-weight: 500;
      letter-spacing: .1px;
      margin: 0px 0px 12px;
    }
    #review-review-text {
      justify-content: flex-start;
      font-size: 16px;
      font-weight: 300;
      padding: 0px 30px 0px 0px;
      margin: 0px 48px 0px 0px;
    }
    .review-review-pic {
      cursor:pointer;
      justify-content: flex-end;
      vertical-align: middle;
      height: 14vw;
      width: 14vw;
      border-radius: 10%;
      max-width:175px;
      max-height:175px;
    }
  `;

export default class Reviews extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      reviewsForItem: [],
      reviewsForShop: [],
      reviewsTab: 'reviewsItem',
      currentPage: 1,
      reviewsPerPage: 4,
      isOpen: false,
      x: 0,
      dropdown: false,
      sortName: 'Recommended',
      currentItemReview: [],
      currentShopReview: [],
      categoryId: 3,
    };
    this.getAllReviewsForItem = this.getAllReviewsForItem.bind(this);
    this.getAllReviewsForShop = this.getAllReviewsForShop.bind(this);
    this.handleClick = this.handleClick.bind(this);
    this.handleModalClick = this.handleModalClick.bind(this);
    this.handleClickIdItem = this.handleClickIdItem.bind(this);
    this.handleClickIdShop = this.handleClickIdShop.bind(this);
    this.handleDropdown = this.handleDropdown.bind(this);
    this.getOrderedReviews = this.getOrderedReviews.bind(this);
    this.handleSortNewest = this.handleSortNewest.bind(this);
    this.handleSortRecommended = this.handleSortRecommended.bind(this);
  }

  componentDidMount() {
    const { categoryId } = this.state;
    this.getAllReviewsForItem(categoryId);
    this.getAllReviewsForShop(categoryId);
  }

  getAllReviewsForItem(id) {
    axios.get(`/reviewsItem/${id}`)
      .then((results) => {
        for (let i = 0; i < results.data.length; i += 1) {
          const dateArr = results.data[i].reviewDate.split(' ');
          results.data[i].reviewDate = `${dateArr[1]} ${dateArr[2]}, ${dateArr[3]}`;
        }
        this.setState({
          reviewsForItem: results.data,
        });
      })
      .catch((err) => {
        console.error(err);
      });
  }

  getOrderedReviews() {
    const { reviewsForItem, reviewsForShop } = this.state;
    const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    const getOrderedReviewItems = () => {
      for (let i = 0; i < reviewsForItem.length; i += 1) {
        const datesArr = reviewsForItem[i].reviewDate.split(' ');
        reviewsForItem[i].month = datesArr[0];
        reviewsForItem[i].day = datesArr[1];
        reviewsForItem[i].year = datesArr[2]
      }
      return reviewsForItem;
    };
    getOrderedReviewItems();
    const sortedByDay = reviewsForItem.sort((a, b) => {
      return parseFloat(b.day) - parseFloat(a.day)
    });
    const sortedByMonth = sortedByDay.sort((a, b) => {
      return months.indexOf(b.month) - months.indexOf(a.month)
    });
    const sortedByYearItem = sortedByMonth.sort((a, b) => {
      return parseFloat(b.year) - parseFloat(a.year)
    });
    const getOrderedReviewShop = () => {
      for (let i = 0; i < reviewsForShop.length; i += 1) {
        const datesArr = reviewsForShop[i].reviewDate.split(' ');
        reviewsForShop[i].month = datesArr[0];
        reviewsForShop[i].day = datesArr[1];
        reviewsForShop[i].year = datesArr[2]
      }
      return reviewsForShop;
    };
    getOrderedReviewShop();
    const sortedByDayShop = reviewsForShop.sort((a, b) => {
      return parseFloat(b.day) - parseFloat(a.day)
    });
    const sortedByMonthShop = sortedByDayShop.sort((a, b) => {
      return months.indexOf(b.month) - months.indexOf(a.month)
    });
    const sortedByYearShop = sortedByMonthShop.sort((a, b) => {
      return parseFloat(b.year) - parseFloat(a.year)
    });
    this.setState({
      reviewsForItem: sortedByYearItem,
      reviewsForShop: sortedByYearShop,
    });
  }

  getAllReviewsForShop(id) {
    axios.get(`/reviewsShop/${id}`)
      .then((results) => {
        for (let i = 0; i < results.data.length; i += 1) {
          const dateArr = results.data[i].reviewDate.split(' ');
          results.data[i].reviewDate = `${dateArr[1]} ${dateArr[2]}, ${dateArr[3]}`;
        }
        this.setState({
          reviewsForShop: results.data,
        });
      })
      .catch((err) => {
        console.error(err);
      });
  }

  getRating(rating) {
    if (rating === 1) {
      console.log(this.state);
      return <FaStar />;
    }
    if (rating === 2) {
      return <div><FaStar/> <FaStar/></div>;
    } if (rating === 3) {
      return <div><FaStar/> <FaStar/> <FaStar/></div>;
    } if (rating === 4) {
      return <div><FaStar/> <FaStar/> <FaStar/> <FaStar/></div>;
    }
    return <div><FaStar/> <FaStar/> <FaStar/> <FaStar/> <FaStar/></div>;
  }

  handleClick(e) {
    this.setState({
      reviewsTab: e.target.value,
      currentPage: 1,
    });
  }

  handleClickIdItem(id) {
    const { reviewsForItem } = this.state;
    for (let i = 0; i < reviewsForItem.length; i += 1) {
      if (reviewsForItem[i].id === id) {
        this.setState({
          currentItemReview: reviewsForItem[i],
        });
      }
    }
  }

  handleClickIdShop(id) {
    const { reviewsForShop } = this.state;
    for (let i = 0; i < reviewsForShop.length; i += 1) {
      if (reviewsForShop[i].id === id) {
        this.setState({
          currentShopReview: reviewsForShop[i],
        });
      }
    }
  }

  handleModalClick() {
    const { isOpen } = this.state;
    this.setState({
      isOpen: !isOpen,
    });
  }

  handleDropdown() {
    const { dropdown } = this.state;
    this.setState({
      dropdown: !dropdown,
    });
  }

  handleSortNewest() {
    this.setState({
      sortName: 'Newest',
      currentPage: 1,
    });
    this.getOrderedReviews();
    this.handleDropdown();
  }

  handleSortRecommended() {
    const { categoryId } = this.state;
    this.setState({
      sortName: 'Recommended',
      currentPage: 1,
    });
    this.getAllReviewsForItem(categoryId);
    this.getAllReviewsForShop(categoryId);
    this.handleDropdown();
  }

  render() {
    const {
      reviewsForItem, reviewsForShop, reviewsTab, currentPage,
      reviewsPerPage, isOpen, currentShopReview, currentItemReview, x, dropdown,
      sortName,
    } = this.state;
    const indexOfLastReview = currentPage * reviewsPerPage;
    const indexOfFirstReview = indexOfLastReview - reviewsPerPage;
    const currentReviewsForItem = reviewsForItem.slice(indexOfFirstReview, indexOfLastReview);
    const currentReviewsForShop = reviewsForShop.slice(indexOfFirstReview, indexOfLastReview);
    const paginate = (pageNumber) => this.setState({
      currentPage: pageNumber,
    });
    const goLeft = () => {
      if (x === 0) {
        this.setState({
          x: 0,
        });
      } else {
        this.setState({
          x: x + 400,
        });
      }
    };
    const goRight = () => {
      if (x === -100 * (reviewsForItem.length) + 400) {
        this.setState({
          x: -100 * (reviewsForItem.length) + 400,
        });
      } else {
        this.setState({
          x: x - 400,
        });
      }
    };

    if (reviewsTab === 'reviewsItem') {
      return (
        <ReviewsContainer className="ReviewsContainer">
          <ReviewsHeader
            reviewsForShop={reviewsForShop}
            reviewsForItem={reviewsForItem}
            handleClick={this.handleClick}
            handleSortNewest={this.handleSortNewest}
            handleSortRecommended={this.handleSortRecommended}
            handleDropdown={this.handleDropdown}
            reviewsTab={reviewsTab}
            dropdown={dropdown}
            sortName={sortName}
          />
          <ReviewsForItem
            reviewsForItem={currentReviewsForItem}
            getRating={this.getRating}
            isOpen={isOpen}
            handleModalClick={this.handleModalClick}
            handleClickIdItem={this.handleClickIdItem}

          />
          <ReviewsModal
            isOpen={isOpen}
            handleModalClick={this.handleModalClick}
            currentReview={currentItemReview}
            getRating={this.getRating}

          />
          <Pagination
            reviewsPerPage={reviewsPerPage}
            totalReviews={reviewsForItem.length}
            paginate={paginate}
            currentPage={currentPage}
          />
          <ReviewsPhotoCarousel
            reviewsForItem={reviewsForItem}
            isOpen={isOpen}
            handleModalClick={this.handleModalClick}
            handleClickIdItem={this.handleClickIdItem}

            x={x}
            goLeft={goLeft}
            goRight={goRight}
          />
        </ReviewsContainer>
      );
    }
    return (
      <ReviewsContainer className="ReviewsContainer">
        <ReviewsHeader
          reviewsForShop={reviewsForShop}
          reviewsForItem={reviewsForItem}
          handleClick={this.handleClick}
          handleSortNewest={this.handleSortNewest}
          handleSortRecommended={this.handleSortRecommended}
          handleDropdown={this.handleDropdown}
          reviewsTab={reviewsTab}
          dropdown={dropdown}
          sortName={sortName}
        />
        <ReviewsForShop
          reviewsForShop={currentReviewsForShop}
          getRating={this.getRating}
          isOpen={isOpen}
          handleModalClick={this.handleModalClick}
          handleClickIdShop={this.handleClickIdShop}
        />
        <ReviewsModal
          isOpen={isOpen}
          handleModalClick={this.handleModalClick}
          currentReview={currentShopReview}
          getRating={this.getRating}
        />
        <Pagination
          reviewsPerPage={reviewsPerPage}
          totalReviews={reviewsForShop.length}
          paginate={paginate}
          currentPage={currentPage}
        />
        <ReviewsPhotoCarousel
          reviewsForItem={reviewsForItem}
          isOpen={isOpen}
          handleModalClick={this.handleModalClick}
          handleClickIdItem={this.handleClickIdItem}
          x={x}
          goLeft={goLeft}
          goRight={goRight}
        />
      </ReviewsContainer>
    );
  }
}