import React, { useEffect, useState } from "react";
import Icons from "../../Helpers/Icons";
import InputCom from "../../Helpers/Inputs/InputCom";
import {Link, useNavigate} from 'react-router-dom'
import usersService from "../../../services/UsersService";
import LoadingSpinner from "../../Spinners/LoadingSpinner";

import {toast} from 'react-toastify'

import {Formik, Form} from 'formik'
import * as Yup from 'yup'

const validationSchema = Yup.object().shape({
  email: Yup.string()
    .email('Wrong email format')
    .min(3, 'Minimum 3 characters')
    .max(50, 'Maximum 50 characters')
    .required('Email is required'),
  firstname: Yup.string()
    .min(3, 'Minimum 3 characters')
    .max(25, 'Maximum 25 characters')
    .required('Firstname is required'),
  lastname: Yup.string()
    .min(3, 'Minimum 3 characters')
    .max(25, 'Maximum 25 characters')
    .required('Lastname is required'),
  city: Yup.string()
    .min(3, 'Minimum 3 characters')
    .max(25, 'Maximum 25 characters')
    .required('City is required'),
  state: Yup.string()
    .min(3, 'Minimum 3 characters')
    .max(25, 'Maximum 25 characters')
    .required('State is required'),
})

const initialValues = {
  firstname: '',
  lastname: '',
  state: '',
  city: '',
  email: ''
}

export default function PersonalInfoTab({
  datas,
  frstNmeHndlr,
  lstNmeHndlr,
  dscrphn,
  profileImg,
  coverImg,
  profileImgInput,
  browseProfileImg,
  profileImgChangHandler,
  coverImgInput,
  browseCoverImg,
  coverImgChangHandler,
}) {

  const apiCall = new usersService()
  let navigate = useNavigate()

  let [togglePromotion, setTogglePromotion] = useState(false)

  let [profile, setProfile] = useState({ // state for requesting from load profile API
    data: [],
    loading: true,
    status: false
  })

  let [requestStatus, setRequestState] = useState({ // state for requesting from update api
    message: '',
    loading: false,
    status: false
  })

  let [inputs, setInputs] = useState({ // State for input fields
    firstname: '',
    lastname: '',
    state: '',
    city: '',
    email: ''
  })

  // const handleChange = ({target:{name, value}}) => {
  //   setInputs(prev => ({...prev, [name]:value}))
  // }

  const handleUpdateUser = (values, helpers)=> {
    setRequestState({message: '', loading: true, status: false})
    
    apiCall.updateProfile(values).then((res)=>{
      if(res.data.internal_return < 0){
        setRequestState({message: 'Profile Was unable to update', loading: false, status: false})
        return
      }
      // setRequestState({message: 'Profile update successfully', loading: false, status: true})
      toast.success("Update Successful");
      setTimeout(()=>{navigate('/',{replace:true})},1000)
    }).catch(error => {
      setRequestState({message: 'Opps! an error occurred. Try Agian', loading: false, status: false})
    })
  }

  const loadProfile = ()=>{ // function to load user profile
    apiCall.loadProfile().then((res)=>{
      if(res.data.internal_return < 0){
        setProfile(prev => ({...prev, loading: false, status: true}))
        return
      }
      setProfile(prev => ({...prev, data: [res.data], loading: false, status: true}))
      setInputs({
        firstname: res.data.firstname,
        lastname: res.data.lastname,
        state: res.data.state,
        city: res.data.city,
        email: res.data.email
      })
    }).catch(error =>{
      setProfile(prev => ({...prev, loading: false, status: false}))
    })
  }

  useEffect(()=>{
    loadProfile() // loads user profile unto the page
  },[])

  return (

    profile.loading ?
      <div className="personal-info-tab w-full flex flex-col justify-between">
        <div className="p-3">
          <LoadingSpinner size='32' color='sky-blue' />
        </div>
      </div>
    :
      <div className="personal-info-tab w-full flex flex-col justify-between">
        <Formik initialValues={inputs} validationSchema={validationSchema} onSubmit={handleUpdateUser}>
          {(props => {
            return (
            <Form>
            {
            profile.data.length ? 
            profile.data.map((item, index) => (
              <div key={index} className="flex flex-col-reverse sm:flex-row">
                <div className="flex-1 sm:mr-10">
                  <div className="fields w-full">
                    {/* inputs starts here */}
                    {/* username */}
                    <div className="field w-full mb-6">
                      <InputCom
                        label="User Name"
                        type="text"
                        name="username"
                        placeholder=""
                        value={item.username}
                        disable={true}
                      />
                    </div>

                    {/* Email */}
                    <div className="field w-full mb-6">
                      <InputCom
                        label="Email"
                        type="text"
                        name="email"
                        placeholder="Email"
                        value={props.values.email}
                        inputHandler={props.handleChange}
                        blurHandler={props.handleBlur}
                      />
                      {(props.errors.email && props.touched.email) && <p className="text-sm text-red-500">{props.errors.email}</p>}
                    </div>
                    {/* first name and last name */}
                    <div className="xl:flex xl:space-x-7 mb-6">
                      <div className="field w-full mb-6 xl:mb-0">
                        <InputCom
                          label="First Name"
                          type="text"
                          name="firstname"
                          placeholder="First Name"
                          value={props.values.firstname}
                          inputHandler={props.handleChange}
                          blurHandler={props.handleBlur}
                        />
                        {(props.errors.firstname && props.touched.firstname) && <p className="text-sm text-red-500">{props.errors.firstname}</p>}
                      </div>
                      <div className="field w-full">
                        <InputCom
                          label="Last Name"
                          type="text"
                          name="lastname"
                          placeholder="Last Name"
                          value={props.values.lastname}
                          inputHandler={props.handleChange}
                          blurHandler={props.handleBlur}
                        />
                        {(props.errors.lastname && props.touched.lastname) && <p className="text-sm text-red-500">{props.errors.lastname}</p>}
                      </div>
                    </div>

                    {/* Country */}
                    <div className="field w-full mb-6">
                      <InputCom
                        label="Country"
                        type="text"
                        name="country"
                        value={item.country}
                        disable={true}
                      />
                    </div>

                    {/* State/Province */}
                    <div className="field w-full mb-6">
                      <InputCom
                        label="State/Province"
                        type="text"
                        name="state"
                        placeholder="State"
                        value={props.values.state}
                        inputHandler={props.handleChange}
                        blurHandler={props.handleBlur}
                      />
                      {(props.errors.state && props.touched.state) && <p className="text-sm text-red-500">{props.errors.state}</p>}
                    </div>

                    {/* City */}
                    <div className="field w-full mb-6">
                      <InputCom
                        label="City"
                        type="text"
                        name="city"
                        placeholder="City"
                        value={props.values.city}
                        inputHandler={props.handleChange}
                        blurHandler={props.handleBlur}
                      />
                      {(props.errors.city && props.touched.city) && <p className="text-sm text-red-500">{props.errors.city}</p>}
                    </div>

                    {/* Preferred Communication*/}
                    <div className='field w-full mb-6 md:flex items-center space-x-4'>
                        <label className='input-label text-[#181c32] dark:text-white text-base font-semibold'>Pref. Communication</label>
                        <div className="check-box">
                          <div className="flex items-center justify-start">
                            <div className="check-input flex items-center mr-1">
                              <input className="w-4 h-4 cursor-pointer" type="checkbox" name="prefcomm1" id="" />
                              <span className="mx-2 text-base text-dark-gray dark:text-white">Email</span>
                            </div>
                            <div className="check-input flex items-center">
                              <input className="w-4 h-4 cursor-pointer" type="checkbox" name="prefcomm2" id="" />
                              <span className="mx-2 text-base text-dark-gray dark:text-white">Phone</span>
                            </div>
                          </div>
                        </div>
                    </div>

                    {/* Allow Promotions */}
                    <div className='field w-full mb-6 flex items-center space-x-4'>
                        <label className='input-label text-[#181c32] dark:text-white text-base font-semibold'>Allow Promotions</label>
                        <div className="cursor-pointer flex items-center" onClick={()=>setTogglePromotion(prev => !prev)}>
                          <div className={`h-6 w-8 mr-1 p-1 ${togglePromotion ? 'bg-sky-blue flex justify-end items-center': 'bg-slate-200'} rounded-full transition`}>
                            <div className="w-4 h-full bg-white rounded-full"></div>  
                          </div>
                        </div>
                    </div>
                    {/* inputs ends here */}
                  </div>
                </div>
                <div className="w-[232px] mb-10">
                  <div className="update-profile w-full mb-9">
                    <h1 className="text-xl tracking-wide font-bold text-dark-gray dark:text-white flex items-center mb-2">
                      Update Profile
                      <span className="ml-1">
                        <Icons name="block-question" />
                      </span>
                    </h1>
                    <p className="text-base text-thin-light-gray mb-5">
                      Profile of at least Size
                      <span className="ml-1   text-dark-gray dark:text-white">
                        300x300
                      </span>
                      . Gifs work too.
                      <span className="ml-1   text-dark-gray dark:text-white">
                        Max 5mb
                      </span>
                      .
                    </p>
                    <div className="flex justify-center">
                      <div className="w-full relative">
                        <img
                          src={profileImg}
                          alt=""
                          className="sm:w-[198px] sm:h-[198px] w-[120px] h-[120px] rounded-full overflow-hidden object-cover"
                        />
                        <input
                          ref={profileImgInput}
                          onChange={(e) => profileImgChangHandler(e)}
                          type="file"
                          className="hidden"
                        />
                        <div
                          onClick={browseProfileImg}
                          className="w-[32px] h-[32px] absolute bottom-7 sm:right-10 right-[105px]  hover:bg-pink bg-dark-gray rounded-full cursor-pointer"
                        >
                          <svg
                            width="32"
                            height="32"
                            viewBox="0 0 32 32"
                            fill="none"
                            xmlns="http://www.w3.org/2000/svg"
                          >
                            <path
                              d="M16.5147 11.5C17.7284 12.7137 18.9234 13.9087 20.1296 15.115C19.9798 15.2611 19.8187 15.4109 19.6651 15.5683C17.4699 17.7635 15.271 19.9587 13.0758 22.1539C12.9334 22.2962 12.7948 22.4386 12.6524 22.5735C12.6187 22.6034 12.5663 22.6296 12.5213 22.6296C11.3788 22.6334 10.2362 22.6297 9.09365 22.6334C9.01498 22.6334 9 22.6034 9 22.536C9 21.4009 9 20.2621 9.00375 19.1271C9.00375 19.0746 9.02997 19.0109 9.06368 18.9772C10.4123 17.6249 11.7609 16.2763 13.1095 14.9277C14.2295 13.8076 15.3459 12.6913 16.466 11.5712C16.4884 11.5487 16.4997 11.5187 16.5147 11.5Z"
                              fill="white"
                            />
                            <path
                              d="M20.9499 14.2904C19.7436 13.0842 18.5449 11.8854 17.3499 10.6904C17.5634 10.4694 17.7844 10.2446 18.0054 10.0199C18.2639 9.76139 18.5261 9.50291 18.7884 9.24443C19.118 8.91852 19.5713 8.91852 19.8972 9.24443C20.7251 10.0611 21.5492 10.8815 22.3771 11.6981C22.6993 12.0165 22.7105 12.4698 22.3996 12.792C21.9238 13.2865 21.4443 13.7772 20.9686 14.2717C20.9648 14.2792 20.9536 14.2867 20.9499 14.2904Z"
                              fill="white"
                            />
                          </svg>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
            </div>
            ))
            :
            profile.status ?
            <div className="py-3 text-slate-500">No User Information Found!</div>
            :
            <div className="py-3 text-slate-500">Opps! something went wrong. Try Again Later!</div>
            }
            <div className="content-footer w-full">
              {requestStatus.message != '' && <p className={`text-center text-base ${requestStatus.status ? 'text-green-800' : 'text-red-600'}`}>{requestStatus.message}</p>}
              <div className="w-full h-[120px] border-t border-light-purple dark:border-[#5356fb29]  flex justify-end items-center">
                <div className="flex items-center space-x-4 mr-9">
                  <Link
                    to='/'
                    className="text-18 text-light-red tracking-wide "
                  >
                    <span className="border-b dark:border-[#5356fb29]  border-light-red">
                      {" "}
                      Cancel
                    </span>
                  </Link>

                  {requestStatus.loading ? 
                  <LoadingSpinner size='8' color='sky-blue' />
                  :
                  <button
                  type="submit"
                  className="w-[152px] h-[46px] flex justify-center items-center btn-gradient text-base rounded-full text-white"
                  >
                    Update Profile
                  </button>
                  }
                </div>
              </div>
            </div>
            </Form>
          )
        })}
        </Formik>
      </div>
  );
}
