'use client';
import React, { useEffect, useState } from 'react';
import { Modal, Form, notification, Row, Col } from 'antd';
import InputSelect from '@/components/form/InputSelect';
import TextareaInput from '@/components/form/InputTextArea';
import { reviveLead, getLeadData } from '../service';
import { useSession } from 'next-auth/react';
import { useSelector, useDispatch } from 'react-redux';
import { RootState, AppDispatch } from '@/store/store';
import { LEADS_STATUS } from '@/utills/constant';
import { fetchRoles } from '@/app/role/slice';
import { useRoles } from '@/hooks/useRoles';

interface ReviveLeadModalProps {
  visible: boolean;
  onClose: () => void;
  onSuccess: () => void;
  leadId: number;
}

const ReviveLeadModal: React.FC<ReviveLeadModalProps> = ({
  visible,
  onClose,
  onSuccess,
  leadId,
}) => {
  const [form] = Form.useForm();
  const [loading, setLoading] = useState(false);
  const [leadDetail, setLeadDetail] = useState<any>(null);
  const { data: session } = useSession();
  const user = session?.user;
  const dispatch: AppDispatch = useDispatch();
  const { roles } = useSelector((state: RootState) => state.roles);
  const [roleFilters, setRoleFilters] = useState<any>({
        page: 1,
        sortColumn: 'sort_order',
      });

  useEffect(() => {
    if (roles?.length === 0) {
      dispatch(fetchRoles(roleFilters));
    }
  }, [roles]);

  const { getRoleByName } = useRoles();
  // const isTL = user?.role?.id === getRoleByName('team_lead')?.id;
  const isSalesperson = user?.role?.id === getRoleByName('pre_sales')?.id || user?.role?.id === getRoleByName('field_sales')?.id;

  useEffect(() => {
    if (visible && leadId) {
      fetchLeadInfo();
    }
  }, [visible, leadId]);

  useEffect(() => {
    if (!visible) {
      form.resetFields();
      setLeadDetail(null);
    }
  }, [visible, form]);

  const fetchLeadInfo = async() => {
    try {
      const res = await getLeadData(leadId);
      if (res?.success) {
        setLeadDetail(res.data);
      }
    } catch (error) {
      console.error('Error fetching lead info:', error);
    }
  };

  const onFinish = async(values: any) => {
    setLoading(true);
    try {
      const res = await reviveLead(
        leadId,
        undefined, // new_launch_id
        undefined, // new_project_id
        undefined, // action
        values.remark,
        !isSalesperson ? values.pre_sales_id : (user?.role?.id === getRoleByName('pre_sales')?.id ? user?.id : null),
        !isSalesperson ? values.field_sales_id : (user?.role?.id === getRoleByName('field_sales')?.id ? user?.id : null),
        values.status_id
      );

      if (res?.success) {
        notification.success({
          message: 'Success',
          description: res.message || 'Lead revived successfully.',
        });
        onSuccess();
        onClose();
        form.resetFields();
      }
    } catch (error: any) {
      notification.error({
        message: 'Error',
        description: error?.response?.data?.message || 'Failed to revive lead.',
      });
    } finally {
      setLoading(false);
    }
  };

  const statusOptions = Object.keys(LEADS_STATUS)
    .filter(
      (key) =>
        ![
          'bookingCancelled',
          'bookingDone',
          'tokenDone',
          'visit_obm',
          'visit_vc',
          'visit_sv',
          'scheduled_sv',
          'scheduled_vc',
          'scheduled_obm',
          'dead',
          'notInterested',
          'broker',
          'fake',
        ].includes(key)
    )
    .map((key) => ({
      value: LEADS_STATUS[key as keyof typeof LEADS_STATUS].id,
      label: LEADS_STATUS[key as keyof typeof LEADS_STATUS].name,
    }));

  const launch_sales_options: any[] = [];
  if (leadDetail?.launch_sales) {
    const userMap = new Map();
    leadDetail.launch_sales.forEach((ls: any) => {
      if (ls.pre_sales_id) {
        userMap.set(ls.pre_sales_id, {
          value: ls.pre_sales_id,
          label: ls.pre_sales_name,
          role_name: 'pre-sales',
        });
      }
      if (ls.field_sales_id) {
        userMap.set(ls.field_sales_id, {
          value: ls.field_sales_id,
          label: ls.field_sales_name,
          role_name: 'field-sales',
        });
      }
    });
    launch_sales_options.push(...Array.from(userMap.values()));
  }

  return (
    <Modal
      title="Revive Lead"
      open={visible}
      // onCancel={onClose}
      onCancel={() => {
        form.resetFields();
        onClose();
      }}
      onOk={() => form.submit()}
      confirmLoading={loading}
      maskClosable={false}
      destroyOnClose
      className="custom-new-modal"
      okText="Save"
      cancelText="Cancel"
    >
      <Form form={form} layout="vertical" onFinish={onFinish}>
        <Row gutter={16}>
          <Col span={24}>
            <InputSelect
              name="status_id"
              label="Select Status"
              placeholder="Select a status"
              options={statusOptions}
              rules={[{ required: true, message: 'Please select a status' }]}
              showSearch
            />
          </Col>
          {!isSalesperson && (
            <Col span={24}>
              <InputSelect
                name="assign_sales_id"
                label="Assign Sales"
                placeholder="Select salesperson"
                options={launch_sales_options}
                rules={[{ required: true, message: 'Please select a salesperson' }]}
                showSearch
                onChange={(value) => {
                  const selectedSales = launch_sales_options.find((item) => item.value === value);

                  if (selectedSales?.role_name === 'pre-sales') {
                    form.setFieldsValue({
                      pre_sales_id: value,
                      field_sales_id: null,
                    });
                  } else if (selectedSales?.role_name === 'field-sales') {
                    form.setFieldsValue({
                      field_sales_id: value,
                      pre_sales_id: null,
                    });
                  } else {
                    // fallback (optional)
                    form.setFieldsValue({
                      pre_sales_id: null,
                      field_sales_id: value,
                    });
                  }
                }}
              />
              <Form.Item name="pre_sales_id" hidden><input /></Form.Item>
              <Form.Item name="field_sales_id" hidden><input /></Form.Item>
            </Col>
          )}
          <Col span={24}>
            <TextareaInput
              name="remark"
              label="Remark"
              placeholder="Enter remark"
              rules={[{ required: true, message: 'Please enter a remark' }]}
            />
          </Col>
        </Row>
      </Form>
    </Modal>
  );
};

export default ReviveLeadModal;
