import React, { useEffect, useRef, useState } from 'react';
import {
  Button,
  Card,
  Checkbox,
  Col,
  DatePicker,
  Divider,
  Drawer,
  Form,
  Input,
  message,
  Modal,
  Popconfirm,
  Popover,
  Row,
  Select,
  Tabs,
  Tooltip,
} from 'antd';
import Table, { ColumnProps } from 'antd/lib/table';
import { EditOutlined, SearchOutlined, UndoOutlined, QrcodeOutlined,BarcodeOutlined } from '@ant-design/icons';
import { RequestService } from '@gtpl/shared-services/vms';
import { AlertMessages } from '@gtpl/shared-utils/alert-messages';
import { RequestById, RequestReport, VisitorDto } from '@gtpl/shared-models/vms';
import { RequestForm } from '../../../visitor-request-form/src/lib/pages-visitor-management-visitor-components-visitor-request-form';
import { RequestFormDto } from '@gtpl/shared-models/vms';
import moment from 'moment';
import { request } from 'https';
import Item from 'antd/lib/list/Item';
import Highlighter from 'react-highlight-words';
import Scanner from './barcode-scanner';
/* eslint-disable-next-line */
export interface PagesVisitorManagementVisitorComponentsSecurityPanelGridProps {
  viewrow(rowData: any, arg1: boolean): unknown;
}

export const PagesVisitorManagementVisitorComponentsSecurityPanelGrid = (
  props: PagesVisitorManagementVisitorComponentsSecurityPanelGridProps
) => {
  const [page, setPage] = React.useState(1);
  const onSearch = (value: string) => console.log(value);
  const { Search } = Input;
  const { TabPane } = Tabs;
  const [visitorData, setVisitorData] = useState<any[]>([]);
  const service = new RequestService();
  const [form] = Form.useForm();
  const [drawerVisible, setDrawerVisible] = useState(false);
  const [selectedRequestData, setSelectedRequestData] = useState<any>(
    undefined
  );
  const [checkInData, setCheckInData] = useState<any[]>([]);
  const [filtersData, setFiltersData] = useState<VisitorDto[]>([]);
  const [visitCheckin, setVisitCheckin] = useState<boolean>(false);
  const [visitCheckout, setVisitCheckout] = useState<boolean>(false);
  const [visitCard, setVisitCard] = useState<string>(null);
  const [selectedRowKeysData, setSelectedRowKeysData] = useState<any[]>([]);
  const [selectedRows, setSelectedRows] = useState<VisitorDto[]>([]);
  const [visible, setVisible] = useState<boolean>(false);
  const [cardArray, setCardArray] = useState([]);
  const [activeTab, setActiveTab] = useState('1');
  const searchInput = useRef(null);
  const [searchText, setSearchText] = useState('');
  const [searchedColumn, setSearchedColumn] = useState('');
  const [usedCards, setUsedCards] = useState([]);
  const [selectedData, setSelectedData] = useState<any>([]);
  const [showQrSacn, setShowQrScan] = useState<boolean>(false);
  const [modal, setModal] = useState('');
  let [counter, setCounter] = useState<number>(0);

  const { Option } = Select;

  useEffect(() => {
    getAllData();
    getAllCheckIn();
  }, []);

  const getAllData = () => {
    service.getRequestById().then((res) => {
      if (res.status) {
        const alredyUsedVcards = [];
        const newData = res.data.map((el) => {
          return el.visitorName.map((i) => {
            const visitorCard = el.visitorStatus.filter(
              (rec) => rec.name === i&&!rec.checkOut
            )[0]?.visitorCard;
            if (visitorCard) alredyUsedVcards.push(visitorCard);
            return {
              requestId: el.requestId,
              visitorName: i,
              visitorArrivalDate: el.visitorArrivalDate,
              visitorDepartureDate: el.visitorDepartureDate,
              visitorMobileNumber: el.visitorMobileNumber,
              visitType: el.visitType,
              visitorCard,
            };
          });
        });
        setUsedCards(alredyUsedVcards);
        console.log(newData.flat(1));
        setVisitorData(newData.flat(1));
        setFiltersData(newData);
        AlertMessages.getSuccessMessage(res.internalMessage);
      } else {
        AlertMessages.getErrorMessage(res.internalMessage);
      }
    });
  };

  const getAllCheckIn = () => {
    const id = form.getFieldValue('id') ? form.getFieldValue('id') : 0;
    console.log(id,"id")
    const req = new RequestById(id)
    service.getAllCheckIn(req).then((res) => {
      if (res.status) {
        setCheckInData(res.data);
        AlertMessages.getSuccessMessage(res.internalMessage);
      } else {
        AlertMessages.getErrorMessage(res.internalMessage);
      }
    });
  };

  const updateRequest = (requestData: VisitorDto) => {
    //const arrivalDate = moment(requestData.visitorArrivalDate).format('YYYY-MM-DD HH:mm:ss')
    //const departureDae = moment(requestData.visitorDepartureDate).format('YYYY-MM-DD HH:mm:ss')
    // const updateRequestData = (requestData.visitorName,requestData.visitorEmail,requestData.transportation,requestData.vehicleNumber,requestData.driverName);
    console.log(requestData, '****');
    setVisitCard(requestData.visitorCard);
    setCardArray([...cardArray, requestData.visitorCard]);
    setVisitCheckin(true);
    service
      .createCheckIn(requestData)
      .then((res) => {
        if (res.status) {
          AlertMessages.getSuccessMessage('Updated Successfully');
          getAllData();
          getAllCheckIn();
          setDrawerVisible(false);
        } else {
          if (res.intlCode) {
            AlertMessages.getErrorMessage(res.internalMessage);
          } else {
            AlertMessages.getErrorMessage(res.internalMessage);
          }
        }
      })
      .catch((err) => {
        AlertMessages.getErrorMessage(err.message);
      });
    console.log(cardArray, 'cardd');
  };

  const getAllCheckOut = (requestData: VisitorDto) => {
    //const arrivalDate = moment(requestData.visitorArrivalDate).format('YYYY-MM-DD HH:mm:ss')
    //const departureDae = moment(requestData.visitorDepartureDate).format('YYYY-MM-DD HH:mm:ss')
    // const updateRequestData = (requestData.visitorName,requestData.visitorEmail,requestData.transportation,requestData.vehicleNumber,requestData.driverName);
    setVisitCheckout(true);
    service
      .updateCheckOut(requestData)
      .then((res) => {
        if (res.status) {
          AlertMessages.getSuccessMessage('Updated Successfully');
          getAllCheckIn();
          setDrawerVisible(false);
        } else {
          if (res.intlCode) {
            AlertMessages.getErrorMessage(res.internalMessage);
          } else {
            AlertMessages.getErrorMessage(res.internalMessage);
          }
        }
      })
      .catch((err) => {
        AlertMessages.getErrorMessage(err.message);
      });
  };

  const onChange = (pagination, filters, sorter, extra) => {
    console.log('params', pagination, filters, sorter, extra);
  };

  const closeDrawer = () => {
    setDrawerVisible(false);
  };

  const openDrawer = (viewData: RequestFormDto) => {
    console.log(viewData, '***');
    setDrawerVisible(true);
    viewData.visitorArrivalDate
      ? (viewData.visitorArrivalDate = moment(
          viewData.visitorArrivalDate,
          'YYYY-MM-DD'
        ))
      : null;
    viewData.visitorDepartureDate
      ? (viewData.visitorDepartureDate = moment(
          viewData.visitorDepartureDate,
          'YYYY-MM-DD'
        ))
      : null;
    setSelectedRequestData(viewData);
  };
  console.log(selectedRequestData, '&&&&&');


  const searchData = (id: any) => {
    //form.resetFields();
    const req = new RequestById(id);
    service.getById(req).then((res) => {
      console.log(id, 'id');
      setVisitorData([]);
      if (res.status) {
        // res.data.map((e)=>{
        //   console.log(e,"eeee")
        //   const arrivalDate = moment(e.visitorArrivalDate).format('YYYY-MM-DD')
        //   const departureDate = moment(e.visitorDepartureDate).format('YYYY-MM-DD')
        //   const date = moment(Date.now()).format('YYYY-MM-DD')
        //    if(arrivalDate <= date && departureDate >= date) {
        //      setVisitorData([...visitorData,e])
        //    } 
        // })
        setVisitorData(res.data);
        AlertMessages.getSuccessMessage(res.internalMessage);
      } else {
        AlertMessages.getErrorMessage(res.internalMessage);
      }
    });
  };

  // const getFiltersDropdownData = (filtersData) => {
  //   let searchData: any[] =[];
  //   filtersData.forEach(element => {
  //     if(element.requestId) {
  //       searchData.push(element.requestId)
  //     }
  //     if(element.visitorName) {
  //       searchData.push(element.visitorName)
  //     }
  //   })
  // }

  const getColumnSearchProps = (dataIndex: string) => ({
    filterDropdown: ({ setSelectedKeys, selectedKeys, confirm, clearFilters }) => (
      <div style={{ padding: 8 }}>
        <Input
          ref={searchInput}
          placeholder={`Search ${dataIndex}`}
          value={selectedKeys[0]}
          onChange={e => setSelectedKeys(e.target.value ? [e.target.value] : [])}
          onPressEnter={() => handleSearch(selectedKeys, confirm, dataIndex)}
          style={{ width: 188, marginBottom: 8, display: 'block' }}
        />
        <Button
          type="primary"
          onClick={() => handleSearch(selectedKeys, confirm, dataIndex)}
          icon={<SearchOutlined />}
          size="small"
          style={{ width: 90, marginRight: 8 }}
        >
          Search
        </Button>
        <Button onClick={() => handleReset(clearFilters)} size="small" style={{ width: 90 }}>
          Reset
        </Button>
      </div>
          ),
          filterIcon: filtered => (
            <SearchOutlined type="search" style={{ color: filtered ? '#1890ff' : undefined }} />
          ),
          onFilter: (value, record) => {
            setCounter(++counter);
            return record[dataIndex]
              ? record[dataIndex]
                .toString()
                .toLowerCase()
                .includes(value.toLowerCase())
              : false
          },
          onFilterDropdownVisibleChange: visible => {
            console.log(searchInput.current);
            if (visible) { setTimeout(() => searchInput.current.select()); }
          },
          render: text =>
            text ? (
              searchedColumn === dataIndex ? (
                <Highlighter
                  highlightStyle={{ backgroundColor: '#ffc069', padding: 0 }}
                  searchWords={[searchText]}
                  autoEscape
                  textToHighlight={text.toString()}
                />
                
              ) : text
            ): null
      
        });

        function handleSearch(selectedKeys, confirm, dataIndex) {
          confirm();
          setSearchText(selectedKeys[0]);
          setSearchedColumn(dataIndex);
        };
      function handleReset(clearFilters) {
          clearFilters();
          setSearchText('');
        };

  // const rowSelection = {
  //   onChange: (selectedRowKeys, selectedRows) => {
  //     console.log(selectedRowKeys, 'keys');
  //     console.log(selectedRows, 'rows');

  //     setSelectedRowKeysData(selectedRowKeys);
  //     setSelectedRows(selectedRows);

  //     // setVisible(true);
  //   },
  //   getCheckboxProps: (record) => ({
  //     disabled: record.name === 'Disabled User',
  //     // Column configuration not to be checked
  //     name: record.name,
  //   }),
  //   selectedRowKeys: selectedRowKeysData,
  // };

  const cancel = () => {
    message.error('Clicked on Cancel');
  }

  const onClick = (rowData) => {
    // <Popup>
    //   <div>

    //   </div>

    // </Popup>
    
  }


  const columns: ColumnProps<any>[] = [
    {
      title: 'S.No',
      key: 'sno',
      width: 70,
      responsive: ['sm'],
      render: (text, object, index) => (page - 1) * 10 + (index + 1),
    },
    {
      title: 'Requisition ID',
      dataIndex: 'requestId',
      width: 130,
      align: 'left',
      ...getColumnSearchProps('requestId'),
    },
    {
      title: 'Visit Type',
      dataIndex: 'visitType',
      width: 130,
      align:'left',
    },
    {
      title: `Visitor's Name`,
      dataIndex: 'visitorName',
      width: 130,
      align: 'left',
    },
    {
      title: 'Mobile Number',
      dataIndex: 'visitorMobileNumber',
      width: 130,
      align: 'left',
    },

    {
      title: 'Check-In Date',
      dataIndex: 'visitorArrivalDate',
      width: 130,
      align: 'left',
      render: (value, record) => {
        return (
          <span>
            {record.visitorArrivalDate
              ? moment(record.visitorArrivalDate).format('YYYY-MM-DD')
              : '-'}
          </span>
        );
      },
    },
    {
      title: 'Check-Out Date',
      dataIndex: 'visitorDepartureDate',
      width: 130,
      align: 'left',
      render: (value, record) => {
        return (
          <span>
            {record.visitorDepartureDate
              ? moment(record.visitorDepartureDate).format('YYYY-MM-DD')
              : '-'}
          </span>
        );
      },
    },
    // {
    //   title:'Check In',
    //   dataIndex: 'checkIn',
    //   width: 130,
    //   align: 'center',
    //   render: (text, record, index) => {
    //     return <>
    //       <DatePicker showTime format={'YYYY-MM-DD HH:mm:ss'} autoComplete="off"/>
    //     </>
    //   }
    // },
    // {
    //   title:'Check Out',
    //   dataIndex: 'checkOut',
    //   width: 130,
    //   align: 'center',
    //   render: (text, record, index) => {
    //     return <>
    //       <DatePicker showTime format={'YYYY-MM-DD HH:mm:ss'} autoComplete="off"/>
    //     </>
    //   }
    // },
    {
      title: 'Visitor Card',
      dataIndex: 'visitorCard',
      width: 130,
      align: 'center',
      render: (text, record, index) => {
        return (
          <>
            {text ? (
              text
            ) : (
              <Select
                placeholder="Please Select"
                style={{ width: '130' }}
                showSearch
                allowClear
                onChange={(e) => (record.visitorCard = e)}
              >
                <Option
                  key={1}
                  value={'v1'}
                  disabled={usedCards.includes('v1')}
                >
                  {' '}
                  V1{' '}
                </Option>
                <Option
                  key={2}
                  value={'v2'}
                  disabled={usedCards.includes('v2')}
                >
                  {' '}
                  V2{' '}
                </Option>
                <Option
                  key={3}
                  value={'v3'}
                  disabled={usedCards.includes('v3')}
                >
                  {' '}
                  V3{' '}
                </Option>
                <Option
                  key={4}
                  value={'v4'}
                  disabled={usedCards.includes('v4')}
                >
                  {' '}
                  V4{' '}
                </Option>
                <Option
                  key={5}
                  value={'v5'}
                  disabled={usedCards.includes('v5')}
                >
                  {' '}
                  V5{' '}
                </Option>
                <Option
                  key={6}
                  value={'v6'}
                  disabled={usedCards.includes('v6')}
                >
                  {' '}
                  V6{' '}
                </Option>
                <Option
                  key={7}
                  value={'v7'}
                  disabled={usedCards.includes('v7')}
                >
                  {' '}
                  V7{' '}
                </Option>
                <Option
                  key={8}
                  value={'v8'}
                  disabled={usedCards.includes('v8')}
                >
                  {' '}
                  V8{' '}
                </Option>
                <Option
                  key={9}
                  value={'v9'}
                  disabled={usedCards.includes('v9')}
                >
                  {' '}
                  V9{' '}
                </Option>
                <Option
                  key={10}
                  value={'v10'}
                  disabled={usedCards.includes('v10')}
                >
                  {' '}
                  V10{' '}
                </Option>
                <Option
                  key={11}
                  value={'v11'}
                  disabled={usedCards.includes('v11')}
                >
                  {' '}
                  V11{' '}
                </Option>
                <Option
                  key={12}
                  value={'v12'}
                  disabled={usedCards.includes('v12')}
                >
                  {' '}
                  V12{' '}
                </Option>
                <Option
                  key={13}
                  value={'v13'}
                  disabled={usedCards.includes('v13')}
                >
                  {' '}
                  V13{' '}
                </Option>
                <Option
                  key={14}
                  value={'v14'}
                  disabled={usedCards.includes('v14')}
                >
                  {' '}
                  V14{' '}
                </Option>
                <Option
                  key={15}
                  value={'v15'}
                  disabled={usedCards.includes('v15')}
                >
                  {' '}
                  V15{' '}
                </Option>
                <Option
                  key={16}
                  value={'v16'}
                  disabled={usedCards.includes('v16')}
                >
                  {' '}
                  V16{' '}
                </Option>
                <Option
                  key={17}
                  value={'v17'}
                  disabled={usedCards.includes('v17')}
                >
                  {' '}
                  V17{' '}
                </Option>
                <Option
                  key={18}
                  value={'v18'}
                  disabled={usedCards.includes('v18')}
                >
                  {' '}
                  V18{' '}
                </Option>
                <Option
                  key={19}
                  value={'v19'}
                  disabled={usedCards.includes('v19')}
                >
                  {' '}
                  V19{' '}
                </Option>
                <Option
                  key={20}
                  value={'v20'}
                  disabled={usedCards.includes('v20')}
                >
                  {' '}
                  V20{' '}
                </Option>


              </Select>
            )}
          </>
        );
      },
    },
    {
      title: `Action`,
      dataIndex: 'action',
      width: 130,
      render: (text, rowData) => (
        
        <span>
          
          <Tooltip placement="top" title="Edit">
            
            {/* <EditOutlined className={'editSamplTypeIcon'} type="edit"
              style={{ color: '#1890ff', fontSize: '14px' }}
              onClick={()=>{
                  openDrawer(rowData);
          
              }}
            /> */}
            <Divider type="vertical" />
            <Popconfirm 
              onConfirm={e=>{updateRequest(rowData)}} 
              title={
                <Form.Item rules={[{required:true}]}>
                  <Checkbox >Helmet</Checkbox>
                  <Checkbox>Safety Jacket</Checkbox>
                  <Checkbox>Shoes</Checkbox>
                </Form.Item>
              } 
              onCancel={cancel}
            >
              <Button
                type="primary"
                shape="round"
                size="small"
                // onClick={() => {
                //   console.log(rowData,"****")
                // }}
              >
                Check In
              </Button>
              
              </Popconfirm>
          </Tooltip>
        </span>
      ),
    },
  ];

  const columns1: ColumnProps<any>[] = [
    {
      title: 'S.No',
      key: 'sno',
      width: 130,
      responsive: ['sm'],
      render: (text, object, index) => (page - 1) * 10 + (index + 1),
    },
    {
      title: 'Requisition ID',
      dataIndex: 'requestId',
      width: 130,
      align: 'left',
      ...getColumnSearchProps('requestId'),
    },
    {
      title: `Visitor's Name`,
      dataIndex: 'visitorName',
      width: 130,
      align: 'left',
    },
    {
      title: 'Visitor Card',
      dataIndex: 'visitorCard',
      width: 130,
      align: 'center',
    }, 
    {
      title: `Action`,
      dataIndex: 'action',
      width: 130,
      render: (text, rowData) => (
        <span>
          <Tooltip placement="top" title="Edit">
            {/* <EditOutlined className={'editSamplTypeIcon'} type="edit"
              style={{ color: '#1890ff', fontSize: '14px' }}
              onClick={()=>{
                  openDrawer(rowData);
          
              }}
            /> */}
            <Divider type="vertical" />
            <Button
              type="primary"
              shape="round"
              size="small"
              onClick={() => {
                getAllCheckOut(rowData);
              }}
            >
              Check Out
            </Button>
          </Tooltip>
        </span>
      ),
    },
  ];

  const handleQrScan = (value) => {
    console.log(value,"value")
    setShowQrScan(false)
    form.setFieldsValue({
      id: value
    })
    searchData(value);
    getAllCheckIn();
  }

  // const searchHandler = () => {
  //   const value = form.getFieldValue('id')
  //   searchData(value);
  //   getAllCheckIn();
  // }

  const onReset = () => {
    form.resetFields();
    getAllData()
    getAllCheckIn()
  }

  // const searchHandler = () => {
  //   const id = form.getFieldValue('id');
  //   searchData(id);
  //   getAllCheckIn();
  // }

  return (
    <Card
      title={<span style={{ color: 'white' }}>SECURITY PANEL</span>}
      style={{ textAlign: 'center' }}
      headStyle={{ backgroundColor: '#69c0ff', border: 0 }}
    >
      {/* <Form form={form} layout={'vertical'}>
        <Row>
          <Col
            xs={{ span: 24 }}
            sm={{ span: 24 }}
            md={{ span: 5, offset: 1 }}
            lg={{ span: 5, offset: 1 }}
            xl={{ span: 5, offset: 1 }}
            style={{ margin: '1%' }}
          >
            <Form.Item name="requestId" label="RequestId">
              <Input placeholder="Request Id" />
            </Form.Item>
          </Col>
          <Col xs={{ span: 24 }} sm={{ span: 24 }} md={{ span: 5, offset: 1 }} lg={{ span: 5, offset: 1 }} xl={{ span: 5, offset: 1 }} style={{ margin: '1%' }} >

        <Form.Item
          name="visitorName"
          label="VisitorName"
        >
          <Input placeholder='Visitor Name'/>
        </Form.Item>
      </Col>
          <Col
            xs={{ span: 24 }}
            sm={{ span: 24 }}
            md={{ span: 5 }}
            lg={{ span: 5 }}
            xl={{ span: 5 }}
            style={{ marginTop: 45 }}
          >
            <Button
              type="primary"
              icon={<SearchOutlined />}
              // size="small"
              block
              onClick={() => searchData(form.getFieldValue('requestId'))}
              style={{ marginRight: 10, width: 100 }}
            >
              Search
            </Button>
          </Col>
          <Col
            xs={{ span: 24 }}
            sm={{ span: 24 }}
            md={{ span: 5 }}
            lg={{ span: 5 }}
            xl={{ span: 5 }}
            style={{ marginTop: 45 }}
          >
            <Button
              type="primary"
              icon={<UndoOutlined />}
              // size="small"
              block
              onClick={() => getAllData()}
              style={{ marginRight: 10, width: 100 }}
            >
              Reset
            </Button>
          </Col>
        </Row>
      </Form> */}
      <Form form={form} layout="vertical">
        <Row>
      <Col xs={{ span: 24 }} sm={{ span: 24 }} md={{  span: 5, offset: 1 }} lg={{  span: 5, offset: 1 }} xl={{  span: 5, offset: 1 }} style={{ margin: '1%' }}>
            <Form.Item name="id" label="Requisition Id">
              <Input placeholder="Scan barcode" 
                suffix={<BarcodeOutlined onClick={(e) => { setShowQrScan(true); setModal('id'); }} style={{ fontSize: '28px', marginTop: '3px', marginRight: '-6px' }} />} />
            </Form.Item>
      </Col>
      {/* <Col style={{margin:'1%',marginTop:'3%'}}>
        <Form.Item name="search">
          <Button icon={<SearchOutlined />} type="primary" onClick={searchHandler}>Search</Button>
        </Form.Item>
      </Col> */}
      <Col style={{margin:'1%',marginTop:'3%'}}>
        <Form.Item name="reset">
          <Button icon={<UndoOutlined />} type="primary" onClick={onReset}>Reset</Button>
        </Form.Item>
      </Col>
      </Row>
     </Form>
      <br></br>
      <Tabs
        onChange={(key) => {
          setActiveTab(key);
        }}
        activeKey={activeTab}
      >
        <TabPane
          key="1"
          tab={<span style={{ color: '#bfbfbf' }}>{'Check-In'}</span>}
        >
          <Table
            key={Date.now()}
            // rowSelection={{
            //   ...rowSelection,
            // }}
            rowKey={(record) => record.visitorName + '$' + record.requestId}
            columns={columns}
            dataSource={visitorData}
            scroll={{ x: true }}
            pagination={{
              onChange(current) {
                setPage(current);
              },
            }}
            onChange={onChange}
            bordered
          />
        </TabPane>
        <TabPane
          key="2"
          tab={<span style={{ color: '#bfbfbf' }}>{'Check-Out'}</span>}
        >
          <Table
            key={counter}
            // rowSelection={{
            //   ...rowSelection,
            // }}
            rowKey={(record) => record.id}
            columns={columns1}
            dataSource={checkInData}
            scroll={{ x: true }}
            pagination={{
              onChange(current) {
                setPage(current);
              },
            }}
            onChange={onChange}
            bordered
          />
        </TabPane>
      </Tabs>
      <Modal
          className='qr-container'
          key={'modal' + Date.now()}
          width={'95%'}
          style={{ top: 30, alignContent: 'right' }}
          visible={showQrSacn}
          onCancel={() => { setShowQrScan(false) }}
          title={<React.Fragment>
          </React.Fragment>}
        >
          {
            modal == 'id' ? <Scanner handleScan={handleQrScan} /> : null
          }

        </Modal>
    </Card>
  );
};

export default PagesVisitorManagementVisitorComponentsSecurityPanelGrid;
