import { AdjustmentNoteCategoryEnum } from "@gtpl/shared-models/common-models";
import { Button, Descriptions } from "antd";
import appSettings from "apps/services/config";
import axios from "axios";
import { request } from "http";
import { AdjusmentNoteRequest } from "libs/shared-models/finance/src/lib/debit-print-request";
import { FactoriesInput } from "libs/shared-models/sale-management/src/lib/sale-order";
import { AdjustmentNoteService } from "libs/shared-services/finance/src/lib/adjustment-note-service";
import moment from "moment";
import React, { useEffect, useState } from "react"
import { async } from "rxjs/internal/scheduler/async";

export interface DebitCreditPrintProps{
    data : any
    tab:string
  }
export const DebitCreditPrint =(props:DebitCreditPrintProps)=>{
    const [data,setData] = useState([])
    let totalPrice = 0
    let totalAmt = 0
    let totalTax = 0
    const service = new AdjustmentNoteService()
    let exporterDetails = FactoriesInput;
 

//    const unitsData = FactoriesInput.find(item => item.id === 1) 
   useEffect(() => {
       getData();
   }, []);
console.log(props.data,'000000000000000000');

    const getData = () => {
        try {const debitNo = props.data
            const tabName = props.tab
            const request = new AdjusmentNoteRequest(debitNo,tabName)
            service.getAllPrintInfo(request)
            .then(res=>{
                if(res.status){
                    setData(res.data)
                    console.log(res.data);
                }
            })
        } catch (error) {
            console.error('Error fetching print info:', error);
        }
    };
    const unitsData = exporterDetails.find(
        (item) => item.id == data[0]?.plantId 
      );
    // const getCssFromComponent = (fromDoc, toDoc) => {
    //     Array.from(fromDoc.styleSheets).forEach((styleSheet: any) => {
    //       if (styleSheet.cssRules) { // true for inline styles
    //         const newStyleElement = toDoc.createElement('style');
    //         Array.from(styleSheet.cssRules).forEach((cssRule: any) => {
    //           newStyleElement.appendChild(toDoc.createTextNode(cssRule.cssText));
    //         });
    //         toDoc.head.appendChild(newStyleElement);
    //       }
    //     });
    //   }

    const getCssFromComponent = (fromDoc: Document, toDoc: Document) => {
        Array.from(fromDoc.styleSheets).forEach((styleSheet: CSSStyleSheet) => {
          try {
            if (styleSheet?.cssRules) { // true for inline styles and same-origin stylesheets
              const newStyleElement = toDoc.createElement("style");
              Array.from(styleSheet.cssRules).forEach((cssRule: CSSRule) => {
                newStyleElement.appendChild(toDoc.createTextNode(cssRule.cssText));
              });
              toDoc.head.appendChild(newStyleElement);
            }
          } catch (e) {
            console.warn("Could not access stylesheet rules for", styleSheet.href, e);
          }
        });
      };

    const printOrder = () => {
        const divContents = document.getElementById('printme').innerHTML;
        const element = window.open('', '', 'height=700, width=1024');
        element.document.write(divContents);
        getCssFromComponent(document, element.document);
        element.document.close();
        element.print();
        element.close(); // to close window when click on cancel/Save
    };
    const numberToWords = require('number-to-words');

    function convertDecimalToWords(decimalPart) {
      const decimalDigits = decimalPart.toString().split('').map(Number);
      const decimalWords = decimalDigits.map(digit => numberToWords.toWords(digit));
      return decimalWords.join(' ');
    }
    
    const totalAmount = data.reduce((sum, e) => {
      const itemAmount = e.price? (Number(e.quantity)*Number(e.price))+((Number(e.quantity)*Number(e.price)*Number(e.tax_percentage))/100): 0
      return sum + itemAmount;
    }, 0);
    const integerPart = Math.floor(totalAmount);
    const decimalPart = Math.round((totalAmount - integerPart) * 100);
    
    const integerWords = numberToWords.toWords(integerPart).toUpperCase();
    const decimalWords = convertDecimalToWords(decimalPart).toUpperCase();
    
    const totalAmountInWords = `${integerWords} . ${decimalWords}`;
    
   
    return(
        <div id='printme' style={{margin:'20px'}}>
        <div style={{display:'flex',flexDirection:'row', margin:'10px'}}>

            <div style={{flex:'1'}}>
                
                <h2 style={{color:'blue',fontWeight:'bolder'}}>{unitsData?.value}</h2>
                <p>Address : {unitsData?.address},</p>
                <p>{unitsData?.village},</p>
                <p>{unitsData?.mandal}</p>
                {/* <p>Phone number : <span>{unitsData?.contact}</span></p>
                <p>Email address : <span>{unitsData?.email}</span></p> */}

            </div>
            <div style={{flex:'1',margin:'5px'}}>
                {props.tab === AdjustmentNoteCategoryEnum.DEBIT?(<h2>Debit Note : {data[0]?.debitNo ?data[0]?.debitNo:'-'}</h2>):(<h2>Credit Note : {data[0]?.creditNo ?data[0]?.creditNo:'-'}</h2>)}
                {props.tab === AdjustmentNoteCategoryEnum.DEBIT?(<p>Debit Note Date : {data[0]?.debitDate?moment(data[0]?.debitDate).format('DD-MM-YYYY'):'-'}</p>):(<p>Credit Note Date : {data[0]?.creditDate?moment(data[0]?.creditDate).format('DD-MM-YYYY'):'-'}</p>)}
                <p>Invoice No : {data[0]?.invoiceNo?data[0]?.invoiceNo:'-'}</p>
                <p>Purchase Order : {data[0]?.poNumber ? data[0]?.poNumber:'-'}</p>
                <p>Driver Name : {}</p>
                <p>Driver License : {}</p>

            </div>
           
        </div>
        <div style={{flex:'1'}}>
                <h2>BILL TO:</h2>
                <p>Client Name : {data[0]?.vendor_name?data[0]?.vendor_name:'-'}</p>
                <p>Address : {data[0]?.vendorApartment}-{data[0]?.vendorStreet}-{data[0]?.vendorCity}</p>
                <p>Phone number : {data[0]?.vendorContact?data[0]?.vendorContact:'-'}</p>
                <p>Email address : {data[0]?.vendorEmail?data[0]?.vendorEmail:'-'}</p>

            </div>
        <div>
            <table style={{borderCollapse:'collapse',borderBlockColor:'black',width:'100%',border:'1px'}}  cellSpacing="0" cellPadding='0'>
                <tr style={{background:'lightGrey'}}>
                <th style={{border: '1px solid #000'}}>S.NO.</th>
                <th style={{border: '1px solid #000'}}>ITEM/SERVICES</th>
                <th style={{border: '1px solid #000'}}>HSN/SAC</th>
                <th style={{border: '1px solid #000'}}>SALE ORDER NO</th>
                <th style={{border: '1px solid #000'}}>QTY</th>
                <th style={{border: '1px solid #000'}}>RATE</th>
                <th style={{border: '1px solid #000'}}>TAX</th>
                <th style={{border: '1px solid #000'}}>AMOUNT</th>
                </tr>
                {data.map((e,index)=>{
                    const sno = index + 1;
                    totalPrice += e.price ? Number(e.price) : 0
                    totalAmt += e.quantity ? Number(e.quantity)*Number(e.price) : 0
                    totalTax += (Number(e.quantity)*Number(e.price)*Number(e.tax_percentage))/100
                    
                    return(
                        <>
                            <tr>
                                <td style={{textAlign:'center'}}>{sno}</td>
                                <td style={{textAlign:'left'}}>{e.item?e.item:'-'}</td>
                                <td style={{textAlign:'center'}}>{e.hsn_code?e.hsn_code:'-'}</td>
                                <td style={{textAlign:'center'}}>{e.soNum?e.soNum:'-'}</td>
                                <td style={{textAlign:'center'}}>{e.quantity?e.quantity:'-'}</td>
                                <td style={{textAlign:'center'}}>{e.price?e.price:'-'}</td>
                                <td style={{textAlign:'center'}}>{e.tax_percentage?e.tax_percentage:'-'}%({((Number(e.quantity)*Number(e.price)*Number(e.tax_percentage))/100).toFixed(2)})</td>
                                <td style={{textAlign:'center'}}>{(Number(e.quantity)*Number(e.price)).toFixed(2)}</td>
                            </tr>
                        </>
                    )
                })}
                <tr style={{background:'lightGrey'}}>
                    <td style={{textAlign:'center'}}></td>
                    <td style={{textAlign:'center'}}>SUB TOTAL</td>
                    <td style={{textAlign:'center'}}>-</td>
                    <td style={{textAlign:'center'}}>-</td>
                    <td style={{textAlign:'center'}}>-</td>
                    <td style={{textAlign:'center'}}>{totalPrice}</td>
                    <td style={{textAlign:'center'}}>-</td>
                    <td style={{textAlign:'center'}}>{totalAmt}</td>
                </tr>
            </table>
            <div>
                <p>TAXABLE AMOUNT : ₹{(totalTax).toFixed(2)}</p>
                <p>TOTAL AMOUNT : ₹{Number(totalAmt)+Number(totalTax)}</p>
                <p>TOTAL AMOUNT(in words) : {totalAmountInWords}</p>

                {/* <p>TOTAL AMOUNT(in words) : {numberToWords.toWords((Number(totalAmt)+Number(totalTax)).toFixed(2)).toUpperCase()}</p> */}
            </div>
            <Button onClick={printOrder} className='noprint' style={{ display: 'block', margin: 'auto', backgroundColor: '#69c0ff' }}><span style={{ color: 'white' }}>Print</span></Button>
        </div>
        </div>
    );
}
export default DebitCreditPrint