import React, { Component } from 'react';
import { Typography, Paper, TextField, Snackbar, withStyles} from '@material-ui/core';
import Images from '../../assets/Images';
import Constant from '../../library/Constant';
import api from '../../api';
import { PropagateLoader } from 'react-spinners';
import { format } from 'date-fns';
import Autocomplete from '@material-ui/lab/Autocomplete';
import TableProgressReport from './TableProgressReport'
import ReactTooltip from "react-tooltip";
import MuiAlert from '@material-ui/lab/Alert';

const Alert = withStyles({
})((props) => <MuiAlert elevation={6} variant="filled" {...props} />);

class ReportProgress extends Component {
    constructor(props) {
        super(props)
        this.state = {
            listApproval: null,
            listCategory: {
                options: [{ name: 'Report Status', value: 'report-status' }, { name: 'Approval Progress', value: 'approval-progress' }],
                getOptionLabel: (option) => option.name,
            },
            listReportType: null,
            listQuarter: {
                options: [{ name: 'Q1', value: 'q1' }, { name: 'Q2', value: 'q2' }, { name: 'Q3', value: 'q3' }],
                getOptionLabel: (option) => option.name,
            },
            listMonth: null,
            listPeriodeMB: null,
            quarter: {
                name: 'Q1', value: 'q1'
            },
            category: {
                name: 'Report Status', value: 'report-status'
            },
            month: null,
            periodeMB: null,
            reportType: null,
            dataTable: [],
            alert: false,
            tipeAlert: '',
            messageAlert: '',
            company: null
        }
    }

    componentDidMount() {
        this.getMonth()
        // console.log(this.state.listCategory);
        // console.log(this.state.category);
    }

    getMonth() {
        this.setState({ loading: true })
        api.create().getMonthTransaction().then(response => {
            let dateNow = new Date()
            dateNow.setMonth(dateNow.getMonth() - 1);
            let month = format(dateNow, 'MMMM')
            if (response.data) {
                if (response.data.status === "success") {
                    let data = response.data.data
                    let monthData = data.map((item) => {
                        return {
                            month_id: item.id,
                            month_value: String(item.month_name).substr(0, 3)
                        }
                    })
                    let defaultProps = {
                        options: monthData,
                        getOptionLabel: (option) => option.month_value,
                    };
                    let index = data.findIndex((val) => val.month_name == month)
                    this.setState({ listMonth: defaultProps, month: index == -1 ? monthData[0] : monthData[index] }, () => {
                        this.getPeriode()
                    })
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' }, () => {
                        if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
                            setTimeout(() => {
                                localStorage.removeItem(Constant.TOKEN)
                                window.location.reload();
                            }, 1000);
                        }
                    })
                }
            } else {
                this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error' })
            }
        })
    }

    getPeriode() {
        let currentYear = new Date().getFullYear()
        let MB = []
        for (var i = 2000; i <= currentYear; i++) {
            MB.push({ name: String(i), value: i })
            if (i == currentYear) {
                MB.push({ name: String(i + 1), value: i + 1})
            }
        }

        let defaultPropsMB = {
            options: MB,
            getOptionLabel: (option) => option.name,
        };

        this.setState({
            listPeriodeMB: defaultPropsMB,
            periodeMB: MB[MB.length - 1],
        }, () => {
            this.getReportType()
            // console.log(this.state.listMonth)
            // console.log(this.state.listPeriodeMB)
        })
    }

    getReportType() {
        let arrayReportType = [
            {
                name: 'Master Budget',
                value: 0
            }, {
                name: 'Monthly Report',
                value: 1
            }, {
                name: 'Rolling Outlook',
                value: 2
            }, {
                name: 'Outlook PA',
                value: 3
            },
        ]

        let defaultProps = {
            options: arrayReportType,
            getOptionLabel: (option) => option.name,
        };
        this.setState({ listReportType: defaultProps, reportType: arrayReportType[0] }, () => {
            // console.log(this.state.periodeMB)
            this.getDataMonitoring()
            // console.log(this.state.listReportType)
            // console.log(this.state.reportType)
        })
    }

    getDataMonitoring() {
        let payload = {
            "year": this.state.periodeMB.name,
            "month": this.state.month.month_id,
            "quarter": this.state.quarter.value

        }
        console.log(payload)
        if (String(this.state.reportType.name).toLocaleUpperCase().includes('MASTER')) {
            this.getMonitoringMB(payload)
        } else if (String(this.state.reportType.name).toLocaleUpperCase().includes('MONTHLY')) {
            this.getMonitoringMR(payload)
        } else if (String(this.state.reportType.name).toLocaleUpperCase().includes('ROLLING')) {
            this.getMonitoringRO(payload)
        } else {
            this.getMonitoringOLPA(payload)
        }
    }

    getMonitoringMB(payload) {
        let dataTable = []
        api.create().getMonitoringMB(payload).then((response) => {
            console.log(response)
            if (response.data) {
                if (response.data.status === "success") {
                    let data = response.data.data
                    data.map((item,index) => {
                        let report = []
                        let statusSubmission = String(item.submission_status).toLocaleUpperCase()
                        let statusOI = String(item.operating_indicator).toLocaleUpperCase()
                        item.report.map((items,index) => {
                            let statusReport = String(items.status_report).toLocaleUpperCase()
                            report.push({report_name: items.report_name, status_report: (statusReport == 'APPROVED' || statusReport == 'REVISION' || statusReport == 'COMPLETED') ? (statusReport + ' - ' + items.report_date) : statusReport })
                        })
                        report.push(
                            {report_name: 'Operating Indicator', status_report: statusOI}, 
                            {report_name: 'Submission Status', status_report: (statusSubmission == 'APPROVED' || statusSubmission == 'REVISION' || statusSubmission == 'COMPLETED') ? (statusSubmission + ' - ' + item.submissionStatusDate) : statusSubmission})
                        dataTable.push([
                            item.company_name,
                            report,
                            item.automatic_reminder_report_date,
                            item.manual_reminder_report_status,
                            item.manual_reminder_report_date,
                            item.submission_status,
                            item.manual_reminder_report_button,
                            item.company_id,
                        ])
                    })
                    // data.map((item,index) => {
                    //     let report = []
                    //     item.report.map((items,indexs) => {
                    //         if (!String(items.report_name).includes('Indicator') && !String(items.report_name).includes('OLPA')) {
                    //             if (String(items.report_name).includes('Fixed')) {
                    //                 report.push({...items, status_report: (items.report_date == null? items.status_report : items.status_report + ' - ' + items.report_date), report_name: 'Fixed Assets Movement'})
                    //             } else {
                    //                 report.push({...items, status_report: (items.report_date == null? items.status_report : items.status_report + ' - ' + items.report_date)})
                    //             }
                    //         }
                    //     })
                    //     report.push({report_name: 'Operating Indicator', status_report: item.operatingIndicator}, {report_name: 'Submission Status', status_report: (item.submissionStatusDate == null? item.submissionStatus : item.submissionStatus + ' - ' + item.submissionStatusDate)})
                    //     dataTable.push([
                    //         item.companyName,
                    //         report
                    //     ])
                    // })
                    // console.log(dataTable)
                    this.setState({dataTable, loading: false})
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning', loading: false }, () => {
                        if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
                            setTimeout(() => {
                                localStorage.removeItem(Constant.TOKEN)
                                window.location.reload();
                            }, 1000);
                        }
                    })
                }
            } else {
                this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error', loading: false })
            }
        })    
    }

    getMonitoringMR(payload) {
        let dataTable = []
        api.create().getMonitoringMR(payload).then((response) => {
            console.log(response)
            if (response.data) {
                if (response.data.status === "success") {
                    let data = response.data.data
                    data.map((item,index) => {
                        let report = item.report
                        report.push({report_name: 'Operating Indicator', status_report: item.operating_indicator}, {report_name: 'Monthly Status', status_report: item.monthly_status})
                        dataTable.push([
                            item.company_name,
                            report,
                            item.automatic_reminder_report_date,
                            item.manual_reminder_report_status,
                            item.manual_reminder_report_date,
                            item.monthly_status,
                            item.manual_reminder_report_button,
                            item.company_id,
                        ])
                    })
                    this.setState({dataTable, loading: false})
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning' , loading: false}, () => {
                        if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
                            setTimeout(() => {
                                localStorage.removeItem(Constant.TOKEN)
                                window.location.reload();
                            }, 1000);
                        }
                    })
                }
            } else {
                this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error', loading: false })
            }
        })    
    }

    getMonitoringRO(payload) {
        let dataTable = []
        api.create().getMonitoringRO(payload).then((response) => {
            console.log(response)
            if (response.data) {
                if (response.data.status === "success") {
                    let data = response.data.data
                    data.map((item,index) => {
                        let report = item.report
                        report.push({report_name: 'Operating Indicator', status_report: item.operating_indicator}, {report_name: 'Rolling Status', status_report: item.rolling_status})
                        dataTable.push([
                            item.company_name,
                            report,
                            item.automatic_reminder_report_date,
                            item.manual_reminder_report_status,
                            item.manual_reminder_report_date,
                            item.rolling_status,
                            item.manual_reminder_report_button,
                            item.company_id,
                        ])
                    })
                    this.setState({dataTable, loading: false})
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning', loading: false }, () => {
                        if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
                            setTimeout(() => {
                                localStorage.removeItem(Constant.TOKEN)
                                window.location.reload();
                            }, 1000);
                        }
                    })
                }
            } else {
                this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error', loading: false })
            }
        })    
    }

    getMonitoringOLPA(payload) {
        let dataTable = []
        api.create().getMonitoringOLPA(payload).then((response) => {
            console.log(response)
            if (response.data) {
                if (response.data.status === "success") {
                    let data = response.data.data
                    data.map((item,index) => {
                        let report = []
                        let statusSubmission = String(item.outlook_status).toLocaleUpperCase()
                        let statusOI = String(item.operating_indicator).toLocaleUpperCase()
                        item.report.map((items,index) => {
                            let statusReport = String(items.status_report).toLocaleUpperCase()
                            report.push({report_name: items.report_name, status_report: (statusReport == 'APPROVED' || statusReport == 'REVISION' || statusReport == 'COMPLETED') ? (statusReport + ' - ' + items.report_date) : statusReport })
                        })
                        report.push(
                            {report_name: 'Operating Indicator', status_report: statusOI}, 
                            {report_name: 'OLPA Status', status_report: (statusSubmission == 'APPROVED' || statusSubmission == 'REVISION' || statusSubmission == 'COMPLETED') ? (statusSubmission + ' - ' + item.submissionStatusDate) : statusSubmission})
                        dataTable.push([
                            item.company_name,
                            report,
                            item.automatic_reminder_report_date,
                            item.manual_reminder_report_status,
                            item.manual_reminder_report_date,
                            item.outlook_status,
                            item.manual_reminder_report_button,
                            item.company_id,
                        ])
                    })
                    // data.map((item,index) => {
                        // let report = []
                        // item.report.map((items,indexs) => {
                        //     if (!String(items.report_name).includes('Indicator') && !String(items.report_name).includes('OLPA')) {
                        //         if (String(items.report_name).includes('Fixed')) {
                        //             report.push({...items, status_report: (items.report_date == null? items.status_report : items.status_report + ' - ' + items.report_date), report_name: 'Fixed Assets Movement'})
                        //         } else {
                        //             report.push({...items, status_report: (items.report_date == null? items.status_report : items.status_report + ' - ' + items.report_date)})
                        //         }
                        //     }
                        // })
                        // report.push({report_name: 'Operating Indicator', status_report: item.operatingIndicator}, {report_name: 'OLPA Status', status_report: (item.submissionStatusDate == null? item.submissionStatus : item.submissionStatus + ' - ' + item.submissionStatusDate)})
                        // dataTable.push([
                        //     item.companyName,
                        //     report
                        // ])
                        // let report = item.report
                        // report.push({report_name: 'Operating Indicator', status_report: item.operating_indicator}, {report_name: 'OLPA Status', status_report: item.olpa_status})
                        // dataTable.push([
                        //     item.company_name,
                        //     report
                        // ])
                    // })
                    this.setState({dataTable, loading: false})
                } else {
                    this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'warning', loading: false }, () => {
                        if (response.data.message.includes("Someone Logged In") || response.data.message.includes("Token Expired")) {
                            setTimeout(() => {
                                localStorage.removeItem(Constant.TOKEN)
                                window.location.reload();
                            }, 1000);
                        }
                    })
                }
            } else {
                this.setState({ alert: true, messageAlert: response.data.message, tipeAlert: 'error', loading: false })
            }
        })    
    }

    closeAlert() {
        this.setState({ alert: false })
    }

    downloadData() {
        let path = ''
        let type = ''
        if (String(this.state.reportType.name).toLocaleUpperCase().includes('MASTER')) {
            path = `public/transaction/monitoring/master_budget?periode=${this.state.periodeMB.name}`
            type = 'Master Budget'
        } else if (String(this.state.reportType.name).toLocaleUpperCase().includes('MONTHLY')) {
            path = `public/transaction/monitoring/monthly_report?months=${this.state.month.month_id}&&periode=${this.state.periodeMB.name}`
            type = `Monthly Report (${this.state.month.month_value})`
        } else if (String(this.state.reportType.name).toLocaleUpperCase().includes('ROLLING')) {
            path = `public/transaction/monitoring/rolling_outlook?quartals=${this.state.quarter.value}&&periode=${this.state.periodeMB.name}`
            type = `Rolling Outlook ${this.state.quarter.name}`
        } else {
            path = `public/transaction/monitoring/outlook_pa?periode=${this.state.periodeMB.name}`
            type = 'Outlook PA'
        }
        this.downloadAllData(path, type)
    }

    async downloadAllData(path, type) {
        let url = `${process.env.REACT_APP_URL_MAIN_BE}/${path}`
        console.log(url);
        let res = await fetch(
            `${process.env.REACT_APP_URL_MAIN_BE}/${path}`
        )
        res = await res.blob()
        this.setState({ loading: false })
        if (res.size > 0) {
            let url = window.URL.createObjectURL(res);
            let a = document.createElement('a');
            a.href = url;
            a.download = `Progress Report - ${type}.xlsx`;
            a.click();
        }
    }

    render() {

        const dataTableMB = [
            ['Tax Planning', '2', 'ABA: Anugerah Buminusantara Abadi', '2021-05-03'],
            ['CAT', '1', 'ABA: Anugerah Buminusantara Abadi', '2021-05-03'],
            ['Profit Loss', '0', 'ABA: Anugerah Buminusantara Abadi', '2021-05-03']
        ]

        const dataTableMBStatus = [
            ['ABA: Anugerah Buminusantara Abadi', '2021', 'approved', '2', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved'],
            ['ABA: Anugerah Buminusantara Abadi', '2021', 'approved', '1', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved'],
            ['ABA: Anugerah Buminusantara Abadi', '2021', 'approved', '0', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved', 'Sudah Approved']
        ]

        const loadingComponent = (
            <div style={{ position: 'fixed', zIndex: 110, top: 0, left: 0, width: '100%', height: '100%', display: 'flex', justifyContent: 'center', alignItems: 'center', background: 'rgba(255,255,255,0.8)' }}>
                <PropagateLoader
                    // css={override}
                    size={20}
                    color={"#274B80"}
                    loading={this.state.loading}
                />
            </div>
        );

        return (
            <div style={{ flex: 1, backgroundColor: '#f8f8f8', minHeight: this.props.height }}>
                <Snackbar open={this.state.alert} autoHideDuration={6000} onClose={() => this.closeAlert()}>
                    <Alert onClose={() => this.closeAlert()} severity={this.state.tipeAlert}>
                        {this.state.messageAlert}
                    </Alert>
                </Snackbar>
                <div>
                    <div className={"main-color"} style={{ height: 78, display: 'flex', alignItems: 'center', paddingLeft: 20 }}>
                        <Typography style={{ fontSize: '16px', color: 'white' }}>Report Status & Approval Progress Monitoring</Typography>
                    </div>
                    <div style={{ padding: 20, width: '100%' }}>
                        <Paper style={{ paddingTop: 10, paddingBottom: 50 }}>
                            <div style={{ borderBottom: 'solid 1px #c4c4c4' }} >
                                <Typography style={{ fontSize: '12px', color: '#4b4b4b', margin: 10 }}>Report Status & Approval Progress</Typography>
                            </div>
                            {/* <div style={{ minWidth: 'max-content', padding: '20px 20px 0px 20px' }}>
                                <div style={{ marginTop: 15, display: 'flex' }}>
                                    <Autocomplete
                                        {...this.state.listCategory}
                                        id="category"
                                        onChange={(event, newInputValue) => this.setState({ category: newInputValue, loading: true }, () => {
                                            // this.getListUserSubcoRO()
                                            this.getReportType()
                                            this.setState({ loading: false })
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Category" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.category}
                                    />
                                    <Autocomplete
                                        {...this.state.listReportType}
                                        id="report-type"
                                        onChange={(event, newInputValue) => this.setState({ reportType: newInputValue, loading: true }, () => {
                                            // this.getListUserSubcoRO()
                                            this.setState({ loading: false })
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Report Type" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.reportType}
                                    />
                                </div>
                            </div> */}
                            <div style={{ minWidth: 'max-content', padding: '20px 20px 0px 20px' }}>
                                <div style={{ marginTop: 15, display: 'flex' }}>
                                    <Autocomplete
                                        {...this.state.listReportType}
                                        id="menu"
                                        onChange={(event, newInputValue) => this.setState({ reportType: newInputValue, loading: true, dataTable: [] }, () => {
                                            // this.getListUserSubcoRO()
                                            this.getDataMonitoring()
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Menu" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.reportType}
                                    />
                                    <Autocomplete
                                        {...this.state.listPeriodeMB}
                                        id="periode"
                                        onChange={(event, newInputValue) => this.setState({ periodeMB: newInputValue, loading: true }, () => {
                                            // this.getListUserSubcoRO()
                                            this.getDataMonitoring()
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Periode" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.periodeMB}
                                    />
                                    {this.state.reportType != null && this.state.reportType.value == 1 && <Autocomplete
                                        {...this.state.listMonth}
                                        id="month"
                                        onChange={(event, newInputValue) => this.setState({ month: newInputValue, loading: true }, () => {
                                            // this.getListUserSubcoRO()
                                            this.getDataMonitoring()
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Month" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.month}
                                    />}
                                    {this.state.reportType != null && this.state.reportType.value == 2 && <Autocomplete
                                        {...this.state.listQuarter}
                                        id="quarter"
                                        onChange={(event, newInputValue) => this.setState({ quarter: newInputValue, loading: true }, () => {
                                            // this.getListUserSubcoRO()
                                            this.getDataMonitoring()
                                        })}
                                        disableClearable
                                        style={{ minWidth: 210, marginRight: 20 }}
                                        renderInput={(params) => <TextField {...params} label="Quarter" margin="normal" style={{ marginTop: 7 }} />}
                                        value={this.state.quarter}
                                    />}
                                </div>
                            </div>
                            <div style={{ marginTop: 20, marginBottom: 20 }}>
                                <div style={{ display: 'flex', justifyContent: 'space-between', padding: '0px 20px 10px 20px' }}>
                                    <div></div>
                                    {/* {this.state.previewDownload && ( */}
                                        <div style={{ width: '50%', justifyContent: 'flex-end', display: 'flex', flexFlow: 'wrap' }}>
                                            <a data-tip={'Download'} data-for="download">
                                                <button
                                                    style={{
                                                        backgroundColor: 'transparent',
                                                        cursor: 'pointer',
                                                        borderColor: 'transparent',
                                                        margin: 5,
                                                        outline: 'none'
                                                    }}
                                                    onClick={() => this.setState({ loading: true }, () => {
                                                        setTimeout(() => {
                                                            this.downloadData()
                                                        }, 100);
                                                    })}
                                                >
                                                    <img src={Images.download} />
                                                </button>
                                            </a>
                                            <ReactTooltip border={true} id="download" place="bottom" type="light" effect="solid" />
                                        </div>
                                    {/* )} */}
                                </div>
                                {this.state.loading && loadingComponent}
                                {this.state.reportType != null && !this.state.loading && (
                                <TableProgressReport
                                    width={this.props.width}
                                    // height={this.props.height}
                                    open={this.props.open}
                                    // month={this.state.month.month_value}
                                    category={this.state.category ? this.state.category.value : 1}
                                    reportType={this.state.reportType ? this.state.reportType.value : 0}
                                    dataTable={this.state.dataTable}
                                    // dataTable={this.state.dataTable}
                                    periode={this.state.periode ? this.state.periode.periode : null}
                                    quarter={this.state.quarter.name}
                                    month={this.state.month.month_id}
                                    company={this.state.company_id}
                                    typeReport={String(this.state.reportType.name).toLocaleUpperCase()}
                                    year={this.state.periodeMB.value}
                                    getMonitoringMB={this.getMonitoringMB.bind(this)}
                                    getMonitoringMR={this.getMonitoringMR.bind(this)}
                                    getMonitoringRO={this.getMonitoringRO.bind(this)}
                                    getMonitoringOLPA={this.getMonitoringOLPA.bind(this)}
                                />
                                )}
                            </div>
                        </Paper>
                    </div>
                </div>
            </div>
        );

    }
}

export default ReportProgress;
