import { toGetSampleFileQuote, toGetSampleFileRate, toUploadQuoteFile, toUploadRateFile } from "@/services/bulkUploadRequest";
import { Col } from "react-bootstrap";
import { Button } from "primereact/button";
import { ToastContainer, toast } from "react-toastify";
import { useSession } from "next-auth/react";
import { useState } from "react";

type ToastType = 'success' | 'error' | 'warning';

const BulkUploadBtn = (props: any)=>{

    const { data } = useSession();
    const [hoveredPlan, setHoveredPlan] = useState(null); 

    const showToast = (type: ToastType, message: string) => {
        const options: any = {
          position: toast.POSITION.TOP_CENTER,
          className: 'toast-font-size',
        };
        toast[type](message, options);
    };

    const toUploadFile = (type: string) => {
      const input = Object.assign(document.createElement('input'), {
        type: 'file',
        accept: '.csv',
      });
      input.onchange = async () => {
        const file = input.files?.[0];
        if (!file) {
          showToast('warning', 'No file selected.');
          return;
        }
        const isCSV = file.name.toLowerCase().endsWith('.csv') && file.type === 'text/csv';
        if (!isCSV) {
          showToast('error', 'Only CSV files are allowed.');
          return;
        }
        const MAX_SIZE = 20 * 1024 * 1024;
        if (file.size > MAX_SIZE) {
          showToast('error', 'File must be 20MB or less.');
          return;
        }
        if (type === 'quote') {
          await uploadQuoteFile(file);
        } else if (type === 'rate') {
          await uploadRateQuoteFile(file, props?.selectedRateOuotesRecords);
        } else {
          showToast('error', 'Invalid upload type.');
        }
      };
      input.click();
    };
    
    const uploadQuoteFile = async (file: File) => {
      const formData = new FormData();
      formData.append('quotes', file);
      try {
        const response = await toUploadQuoteFile(formData);
        const message = response?.message || 'Quote upload completed.';
        if (response?.status === 'success') {
          showToast('success', message);
        } else {
          showToast('error', message);
        }
      } catch (error: any) {
        console.error(error);
        const errorMsg = error?.response?.data?.message || 'Failed to upload quote file.';
        showToast('error', errorMsg);
      }
    };
    
    const uploadRateQuoteFile = async (file: File, selectedItems: any[] | null | undefined) => {
      const formData = new FormData();
      formData.append('rates', file);
      try {
        const response = await toUploadRateFile(formData);
        const message = response?.message || 'Rate upload completed.';
        if (response?.status === 'success') {
          showToast('success', message);
        } else {
          showToast('error', message);
        }
      } catch (error: any) {
        console.error(error);
        const errorMsg = error?.response?.data?.message || 'Failed to upload rate quote file.';
        showToast('error', errorMsg);
      }
    };
    
    const downloadSampleFile = (downloadType: string)=>{
      if (downloadType === 'quote') {
        downloadQuoteSample();
      } else {
        downloadRateSample();
      }
    }

    const downloadQuoteSample = async () => {
      try {
        const response = await toGetSampleFileQuote();
        if (response?.status !== 'success' || !response.data || response.data.trim() === '') {
          throw new Error('Failed to fetch quote sample URL.');
        }
        downloadSampleCSVFile(response.data, 'quote-sample.csv');
      } catch (error) {
        console.error('Quote download error:', error);
        showToast('error', 'Error downloading quote file.');
      }
    };
    
    const downloadRateSample = async () => {
      try {
        const records = props?.selectedRateOuotesRecords;
        if (!Array.isArray(records) || records.length === 0) {
          throw new Error('No selected rate quote records.');
        }
        const makePayload: any = {
          quoteIds: records.map((itemData: any) => itemData.quote_id),
        };
        const response = await toGetSampleFileRate(makePayload);
        if (response?.status !== 'success' || !response.data || response.data.trim() === '') {
          throw new Error('Failed to fetch rate sample URL.');
        }
        downloadSampleCSVFile(response.data, 'rate-sample.csv');
      } catch (error) {
        console.error('Rate download error:', error);
        showToast('error', 'Error downloading rate file.');
      }
    };

    const downloadSampleCSVFile = (fileUrl: string, fileName: string) => {
      if (!fileUrl || typeof fileUrl !== 'string' || fileUrl.trim() === '') {
        throw new Error('Invalid file URL.');
      }
      const link = document.createElement('a');
      link.href = fileUrl;
      link.setAttribute('download', fileName);
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    };

    const checkUserCredentialType = () => {
      const { group_type }: any = data?.user || {};
      return group_type !== 'carriers';;
    };

    const handlePlanHover = (userTypeData: any)=>{
      setHoveredPlan(userTypeData);
    }
    
    const handlePlanLeaveEvent = () => {
      setHoveredPlan(null);
    };

    return (
        <Col lg={6} md={12} sm={12} className="mt-3 mt-lg-0 d-flex justify-content-lg-end justify-content-start">
            <div>
            <ToastContainer />
            </div>
            {checkUserCredentialType() && (
              <div>
                <div className="d-flex flex-wrap gap-2 w-100 justify-content-lg-end">
                    {data?.user?.is_premium || (data?.user?.group_type === 'super_admin' && data?.user?.is_premium === 0) ? (
                      <div className="bulk-upload-btn-flex-column">
                        <Button
                          variant="outline-primary"
                          size="sm"
                          onClick={() => toUploadFile('quote')}
                          className="divStylecss-upload"
                        >
                          <i className="bi bi-upload"></i>&nbsp;Upload Quote
                        </Button>
                        <a href="#" className="bulk-upload-sample-link" onClick={()=>downloadSampleFile('quote')}>Sample CSV for Quote</a>
                      </div>
                    ): (
                      <div className="bulk-upload-btn-flex-column">
                        <Button
                          variant="outline-primary"
                          size="sm"
                          className="divStylecss-upload"
                          onMouseOver={() => handlePlanHover("common_user")}
                        >
                          <i className="bi bi-upload"></i>&nbsp;Upload Quote
                        </Button>
                        <a href="#" className="bulk-upload-disabled-link" disabled={true}>Sample CSV for Quote</a>
                      </div>
                    )}
                    
                    {data?.user?.group_type !== 'customers' && (
                      <div className="bulk-upload-btn-flex-column">
                        <Button
                        variant="outline-primary"
                        size="sm"
                        onClick={() => toUploadFile('rate')}
                        className="divStylecss-upload"
                        >
                          <i className="bi bi-upload"></i>&nbsp;Upload Rates
                        </Button>
                        <a
                        href='#'
                        onClick={props?.disableRateBtn ? (e) => e.preventDefault() : () => downloadSampleFile('rate')}
                        className={`bulk-upload-sample-link ${props?.disableRateBtn ? 'bulk-upload-disabled-link' : ''}`}
                        tabIndex={props?.disableRateBtn ? -1 : 0}
                        >
                        Sample CSV for Rates
                        </a>
                    </div>
                    )}
                </div>
                {hoveredPlan === "common_user" &&
                  <div onMouseLeave={() => handlePlanLeaveEvent()}>
                    <div
                      onMouseLeave={() => handlePlanLeaveEvent()}
                      style={{ position: "relative" }}
                      onClick={() => props.SetCheckPlanModalStatus(true)}
                      x-placement='bottom-start'
                      aria-labelledby='nav-dropdown'
                      className='hover-box dropdown-menu show dropdown-menu-light bulk-import-free-user-type'
                      data-popper-reference-hidden='false'
                      data-popper-escaped='false'
                      data-popper-placement='bottom-start'
                    >
                      <a
                        data-rr-ui-dropdown-item=''
                        className='dropdown-item'
                        role='button'
                        tabindex='0'
                        href='#'
                      >
                        Available in Draydex Premium
                      </a>
                    </div>
                  </div>
                } 
              </div>
            )}
        </Col>
    )
}

export default BulkUploadBtn;