@extends('layouts.app')
@section('title', __( 'lang_v1.all_sales'))

@section('content')

<!-- Content Header (Page header) -->
<section class="content-header no-print">
    <h1>@lang( 'sale.sells')
    </h1>
</section>

@php
$businessdata = \App\Business::where('id',request()->session()->get('user.business_id'))->first();
@endphp

<!-- Main content -->
<section class="content no-print">
    @component('components.filters', ['title' => __('report.filters')])
        @include('sell.partials.sell_list_filters')
        @if(!empty($sources))
            <div class="col-md-3">
                <div class="form-group">
                    {!! Form::label('sell_list_filter_source',  __('lang_v1.sources') . ':') !!}

                    {!! Form::select('sell_list_filter_source', $sources, null, ['class' => 'form-control select2', 'style' => 'width:100%', 'placeholder' => __('lang_v1.all') ]); !!}
                </div>
            </div>
        @endif
    @endcomponent
    @component('components.widget', ['class' => 'box-primary', 'title' => __( 'lang_v1.all_sales')])
        @can('direct_sell.access')
            @slot('tool')
                <div class="box-tools">
                    <a class="btn btn-block btn-primary" href="{{action('SellController@create')}}">
                    <i class="fa fa-plus"></i> @lang('messages.add')</a>
                </div>
            @endslot
        @endcan
        @if(auth()->user()->can('direct_sell.view') ||  auth()->user()->can('view_own_sell_only') ||  auth()->user()->can('view_commission_agent_sell'))
        @php
            $custom_labels = json_decode(session('business.custom_labels'), true);
         @endphp
            <table class="table table-bordered table-striped ajax_view" id="sell_table">
                <thead>
                    <tr>
                        <th><input type="checkbox" id="select-all-row" data-table-id="sell_table"></th>
                        <th>@lang('messages.action')</th>
                        <th>@lang('messages.date')</th>
                        <th>@lang('sale.invoice_no')</th>
                        <th>@lang('sale.customer_name')</th>
                        <th>@lang('lang_v1.contact_no')</th>
                        <th>@lang('sale.location')</th>
                        <th>@lang('sale.payment_status')</th>
                        <th>@lang('lang_v1.payment_method')</th>
                        <th>@lang('sale.total_amount')</th>
                        <th>@lang('sale.total_paid')</th>
                        <th>@lang('lang_v1.sell_due')</th>
                        <th>@lang('lang_v1.sell_return_due')</th>
                        <th>@lang('lang_v1.shipping_status')</th>
                        <th>@lang('lang_v1.total_items')</th>
                        <th>@lang('lang_v1.types_of_service')</th>
                        <th>{{ $custom_labels['types_of_service']['custom_field_1'] ?? __('lang_v1.service_custom_field_1' )}}</th>
                        <th>{{ $custom_labels['sell']['custom_field_1'] ?? '' }}</th>
                        <th>{{ $custom_labels['sell']['custom_field_2'] ?? ''}}</th>
                        <th>{{ $custom_labels['sell']['custom_field_3'] ?? ''}}</th>
                        <th>{{ $custom_labels['sell']['custom_field_4'] ?? ''}}</th>
                        <th>@lang('lang_v1.added_by')</th>
                        <th>@lang('sale.sell_note')</th>
                        <th>@lang('sale.staff_note')</th>
                        <th>@lang('sale.shipping_details')</th>
                        <th>@lang('restaurant.table')</th>
                        <th>@lang('restaurant.service_staff')</th>
                    </tr>
                </thead>
                <tbody></tbody>
                <tfoot>
                    
                    <tr class="bg-gray font-17 footer-total text-center">
                        <td>
                            <div style="display: flex; width: 100%;">
                                @can('product.delete')
                                    {!! Form::open(['url' => action('SellController@bulkDestroy'), 'method' => 'post', 'id' => 'mass_delete_form-sell' ]) !!}
                                    {!! Form::hidden('selected_rows', null, ['id' => 'selected_rows-sell']); !!}
                                    {!! Form::submit(__('lang_v1.delete_selected'), array('class' => 'btn btn-xs btn-danger', 'id' => 'delete-selected-sell')) !!}
                                    {!! Form::close() !!}
                                @endcan
     
                                </div>
                        </td>
                        <td>
                            <div style="display: flex; width: 100%;">
        

                                {!! Form::open(['url' => action('SellController@bulkPrintInvoices'), 'method' => 'post', 'id' => 'bulk_print_invoices_form-sell' ]) !!}
                                {!! Form::hidden('selected_rows', null, ['id' => 'selected_rows-sell-print']); !!}
                                {!! Form::submit(__('Print Merged'), ['class' => 'btn btn-xs btn-success', 'id' => 'print-selected-invoices-sell']) !!}
                                {!! Form::close() !!}
     
                                </div>
                        </td>
                        <td>
                            <div style="display: flex; width: 100%;">
        

                                {!! Form::open(['url' => action('SellController@bulkPrintInvoicePage'), 'method' => 'post', 'id' => 'bulk_print_invoices_form-sell-page' ]) !!}
                                {!! Form::hidden('selected_rows', null, ['id' => 'selected_rows-sell-print-page']); !!}
                                {!! Form::submit(__('Print Separate'), ['class' => 'btn btn-xs btn-success', 'id' => 'print-selected-invoices-sell-page']) !!}
                                {!! Form::close() !!}
     
                                </div>
                        </td>
                        <td colspan="3"><strong>@lang('sale.total'):</strong></td>
                        <td class="footer_payment_status_count"></td>
                        <td class="payment_method_count"></td>
                        <td class="footer_sale_total"></td>
                        <td class="footer_total_paid"></td>
                        <td class="footer_total_remaining"></td>
                        <td class="footer_total_sell_return_due"></td>
                        <td class="footer_total_sell_total_items"></td>
                        <td colspan="2"></td>
                        <td class="service_type_count"></td>
                        <td colspan="7"></td>
                    </tr>
                </tfoot>
            </table>
        @endif
    @endcomponent
</section>
<!-- /.content -->
<div class="modal fade payment_modal" tabindex="-1" role="dialog" 
    aria-labelledby="gridSystemModalLabel">
</div>

<div class="modal fade edit_payment_modal" tabindex="-1" role="dialog" 
    aria-labelledby="gridSystemModalLabel" style="font: 100 !important">
</div>


<!-- This will be printed -->
<!-- <section class="invoice print_section" id="receipt_section">
</section> -->

<!-- Sales Chart Section -->
<section class="content" id="sales_chart_section">
    @component('components.widget', ['class' => 'box-primary', 'title' => __('Sales Chart')])
        @slot('tool')
            <div class="box-tools">
                <button type="button" class="btn btn-sm btn-success" id="refresh_chart_btn">
                    <i class="fa fa-refresh"></i> Refresh Chart
                </button>
            </div>
        @endslot
        <div id="chart_date_info" class="alert alert-info" style="margin-bottom: 15px; display: none;">
            <strong>Date Range:</strong> <span id="chart_date_range_text">All Time</span>
        </div>
        <div id="chartdiv" style="width: 100%; height: 400px; overflow: hidden;"></div>
    @endcomponent
</section>

@stop

@section('css')
<style>
#chartdiv {
  width: 100%;
  height: 400px;
  max-width: 100%;
  overflow: hidden;
}

#sales_chart_section {
    margin-top: 20px;
    max-width: 100%;
    overflow-x: hidden;
}

#sales_chart_section .box {
    overflow: hidden;
}

#sales_chart_section .box-body {
    padding: 15px;
    overflow: hidden;
}

#chart_date_info {
    background-color: #d9edf7;
    border-color: #bce8f1;
    color: #31708f;
    padding: 10px;
    margin-bottom: 15px;
}

#refresh_chart_btn {
    transition: all 0.3s ease;
}

#refresh_chart_btn:hover {
    transform: scale(1.05);
}
</style>
@endsection

@section('javascript')
<!-- amCharts Resources -->
<script src="https://cdn.amcharts.com/lib/5/index.js"></script>
<script src="https://cdn.amcharts.com/lib/5/xy.js"></script>
<script src="https://cdn.amcharts.com/lib/5/themes/Animated.js"></script>
<script src="https://cdn.amcharts.com/lib/5/themes/Responsive.js"></script>
<script type="text/javascript">
$(document).ready( function(){
    //Date range as a button
    $('#sell_list_filter_date_range').daterangepicker(
        dateRangeSettings,
        function (start, end) {
            $('#sell_list_filter_date_range').val(start.format(moment_date_format) + ' ~ ' + end.format(moment_date_format));
            sell_table.ajax.reload();
        }
    );
    $('#sell_list_filter_date_range').on('cancel.daterangepicker', function(ev, picker) {
        $('#sell_list_filter_date_range').val('');
        sell_table.ajax.reload();
    });

    sell_table = $('#sell_table').DataTable({
        processing: true,
        serverSide: true,
        aaSorting: [[1, 'desc']],
        "ajax": {
            "url": "/sells",
            "data": function ( d ) {
                if($('#sell_list_filter_date_range').val()) {
                    var start = $('#sell_list_filter_date_range').data('daterangepicker').startDate.format('YYYY-MM-DD');
                    var end = $('#sell_list_filter_date_range').data('daterangepicker').endDate.format('YYYY-MM-DD');
                    d.start_date = start;
                    d.end_date = end;
                }
                d.is_direct_sale = 1;

                d.location_id = $('#sell_list_filter_location_id').val();
                d.customer_id = $('#sell_list_filter_customer_id').val();
                d.payment_status = $('#sell_list_filter_payment_status').val();
                d.created_by = $('#created_by').val();
                d.sales_cmsn_agnt = $('#sales_cmsn_agnt').val();
                d.service_staffs = $('#service_staffs').val();
                d.payment_method = $('#payment_method').val();

                if($('#shipping_status').length) {
                    d.shipping_status = $('#shipping_status').val();
                }

                if($('#sell_list_filter_source').length) {
                    d.source = $('#sell_list_filter_source').val();
                }
                if($('#cg_filter').length) {
                    d.cg_filter = $('#cg_filter').val();
                }

                if($('#only_subscriptions').is(':checked')) {
                    d.only_subscriptions = 1;
                }

                d = __datatable_ajax_callback(d);
            }
        },
        scrollY:        "75vh",
        scrollX:        true,
        scrollCollapse: true,
        columns: [
            { data: 'mass_delete',orderable: false,  },
            { data: 'action', name: 'action', orderable: false, "searchable": false},
            { data: 'transaction_date', name: 'transaction_date'  },
            { data: 'invoice_no', name: 'invoice_no'},
            { data: 'conatct_name', name: 'conatct_name'},
            { data: 'mobile', name: 'contacts.mobile'},
            { data: 'business_location', name: 'bl.name'},
            { data: 'payment_status', name: 'payment_status'},
            { data: 'payment_methods', orderable: false, "searchable": false},
            { data: 'final_total', name: 'final_total'},
            { data: 'total_paid', name: 'total_paid', "searchable": false},
            { data: 'total_remaining', name: 'total_remaining'},
            { data: 'return_due', orderable: false, "searchable": false},
            { data: 'shipping_status', name: 'shipping_status'},
            { data: 'total_items', name: 'total_items', "searchable": false},
            { data: 'types_of_service_name', name: 'tos.name', @if(empty($is_types_service_enabled)) visible: false @endif},
            { data: 'service_custom_field_1', name: 'service_custom_field_1', @if(empty($is_types_service_enabled)) visible: false @endif},
            { data: 'custom_field_1', name: 'transactions.custom_field_1', @if(empty($custom_labels['sell']['custom_field_1'])) visible: false @endif},
            { data: 'custom_field_2', name: 'transactions.custom_field_2', @if(empty($custom_labels['sell']['custom_field_2'])) visible: false @endif},
            { data: 'custom_field_3', name: 'transactions.custom_field_3', @if(empty($custom_labels['sell']['custom_field_3'])) visible: false @endif},
            { data: 'custom_field_4', name: 'transactions.custom_field_4', @if(empty($custom_labels['sell']['custom_field_4'])) visible: false @endif},
            { data: 'added_by', name: 'u.first_name'},
            { data: 'additional_notes', name: 'additional_notes'},
            { data: 'staff_note', name: 'staff_note'},
            { data: 'shipping_details', name: 'shipping_details'},
            { data: 'table_name', name: 'tables.name', @if(empty($is_tables_enabled)) visible: false @endif },
            { data: 'waiter', name: 'ss.first_name', @if(empty($is_service_staff_enabled)) visible: false @endif },
        ],
        buttons: [
            {
                extend: 'csv',
                text: '<i class="fa fa-file-csv"></i> Export to Csv',
                className: 'btn-sm',
                exportOptions: {
                    columns: ':visible'
                }
            },
            {
                extend: 'excel',
                text: '<i class="fas fa-file-excel"></i> Export to Excel',
                className: 'btn-sm',
                exportOptions: {
                    columns: ':visible'
                }
            },
            {
            extend: 'print',
                text: '<i class="fas fa-print"></i> Print',
                className: 'btn-sm',
                exportOptions: {
                        columns: ':visible'
                    },
                customize: function (win) {
                    var appliedFilters = '';

                    var dateRange = $('#sell_list_filter_date_range').val();
                    if (dateRange) {
                        appliedFilters += '<p><strong>Date Range:</strong> ' + dateRange + '</p>';
                    }
                    var location = $('#sell_list_filter_location_id option:selected').text();
                    if (location) {
                        appliedFilters += '<p><strong>Location:</strong> ' + location + '</p>';
                    }
                    var customer = $('#sell_list_filter_customer_id option:selected').text();
                    if (customer) {
                        appliedFilters += '<p><strong>Customer:</strong> ' + customer + '</p>';
                    }
                    var paymentStatus = $('#sell_list_filter_payment_status option:selected').text();
                    if (paymentStatus) {
                        appliedFilters += '<p><strong>Payment Status:</strong> ' + paymentStatus + '</p>';
                    }
                    var createdBy = $('#created_by option:selected').text();
                    if (createdBy) {
                        appliedFilters += '<p><strong>Created By:</strong> ' + createdBy + '</p>';
                    }
                    var salesCmsnAgnt = $('#sales_cmsn_agnt option:selected').text();
                    if (salesCmsnAgnt) {
                        appliedFilters += '<p><strong>Sales Commission Agent:</strong> ' + salesCmsnAgnt + '</p>';
                    }
                    var serviceStaffs = $('#service_staffs option:selected').text();
                    if (serviceStaffs) {
                        appliedFilters += '<p><strong>Service Staffs:</strong> ' + serviceStaffs + '</p>';
                    }
                    var shippingStatus = $('#shipping_status option:selected').text();
                    if (shippingStatus) {
                        appliedFilters += '<p><strong>Shipping Status:</strong> ' + shippingStatus + '</p>';
                    }
                    var paymentMethod = $('#payment_method option:selected').text();
                    if (paymentMethod) {
                        appliedFilters += '<p><strong>Payment Method:</strong> ' + paymentMethod + '</p>';
                    }
                    var onlySubscriptions = $('#only_subscriptions').is(':checked') ? 'Yes' : 'No';
                    if (onlySubscriptions === 'Yes') {
                        appliedFilters += '<p><strong>Only Subscriptions:</strong> ' + onlySubscriptions + '</p>';
                    }

        

                    if (appliedFilters) {
                        appliedFilters = '<div style="text-align: center;">' +
                                        '<img src="{{ asset('uploads/business_logos/' . $businessdata->logo) }}" style="max-width: 150px; max-height: 150px;" />' +
                                        '<h2 class="text-center mb-3">{{ $businessdata->name }}</h2>' +
                                        '<h3 class="mb-3">All Sales</h3>' +
                                        '<div style="text-align: left;">' +
                                        appliedFilters +
                                        '</div>' +
                                        '</div>';
                    }

                    $(win.document.body).css('font-size', '10pt');
                    $(win.document.body).find('h1, h2').hide();
                    $(win.document.body).find('table').addClass('compact').css('font-size', 'inherit');

                    $(win.document.body).prepend(appliedFilters);

                    var lastTable = $(win.document.body).find('table:last');      
                    
                    lastTable.after(
                        '<div style="text-align: right; margin-top: 40px;">' +
                                    '<p><strong>Authorized Signatory:</strong> ' +' ----------- '+ '</p>');
                }
            },
            {
                text: '<i class="fas fa-columns"></i> Column Visibility',
                className: 'btn-sm column-visibility-btn',
                action: function (e, dt, node, config) {
                    e.preventDefault();
                    
                    // Remove existing dropdown if it exists
                    $('.column-visibility-dropdown').remove();
                    
                    // Create the dropdown
                    var dropdown = $('<div class="column-visibility-dropdown" style="position: absolute; background: #fff; border: 2px solid #28a745; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 9999; padding: 10px; min-width: 200px; max-height: 300px; overflow-y: auto;"></div>');
                    
                    // Get button position
                    var buttonOffset = $(node).offset();
                    var buttonHeight = $(node).outerHeight();
                    
                    // Position dropdown
                    dropdown.css({
                        top: (buttonOffset.top + buttonHeight + 5) + 'px',
                        left: buttonOffset.left + 'px'
                    });
                    
                    // Add header
                    dropdown.append('<div style="font-weight: bold; color: #28a745; margin-bottom: 8px; padding-bottom: 5px; border-bottom: 1px solid #e0e0e0;">Toggle Columns</div>');
                    
                    // Add checkboxes for each column
                    dt.columns().every(function(index) {
                        var column = this;
                        var columnTitle = $(column.header()).text().trim();
                        if (columnTitle) {
                            var isVisible = column.visible();
                            var checkboxItem = $('<label style="display: block; margin: 5px 0; cursor: pointer; padding: 4px 6px; border-radius: 4px; transition: background-color 0.2s;">' +
                                '<input type="checkbox" style="margin-right: 8px;" ' + (isVisible ? 'checked' : '') + '> ' +
                                '<span style="color: #333;">' + columnTitle + '</span>' +
                                '</label>');
                            
                            // Add hover effect
                            checkboxItem.hover(
                                function() { $(this).css('background-color', '#f8f9fa'); },
                                function() { $(this).css('background-color', 'transparent'); }
                            );
                            
                            checkboxItem.find('input[type="checkbox"]').change(function() {
                                column.visible($(this).is(':checked'));
                            });
                            
                            dropdown.append(checkboxItem);
                        }
                    });
                    
                    // Add close button
                    var closeBtn = $('<button style="width: 100%; margin-top: 10px; padding: 6px; background: #28a745; color: white; border: none; border-radius: 4px; cursor: pointer; transition: background-color 0.2s;">Close</button>');
                    closeBtn.hover(
                        function() { $(this).css('background-color', '#218838'); },
                        function() { $(this).css('background-color', '#28a745'); }
                    );
                    closeBtn.click(function() {
                        dropdown.remove();
                    });
                    dropdown.append(closeBtn);
                    
                    // Append to body
                    $('body').append(dropdown);
                    
                    // Close dropdown when clicking outside
                    $(document).on('click.column-visibility', function(e) {
                        if (!$(e.target).closest('.column-visibility-dropdown, .column-visibility-btn').length) {
                            dropdown.remove();
                            $(document).off('click.column-visibility');
                        }
                    });
                }
            },

            {
                extend: 'pdf',
                text: '<i class="fas fa-file-pdf"></i> Export PDF',
                className: 'btn-sm',
                exportOptions: {
                    columns: ':visible'
                }
            },
      
        ],

        "fnDrawCallback": function (oSettings) {
            __currency_convert_recursively($('#sell_table'));
        },
        "footerCallback": function ( row, data, start, end, display ) {
            var footer_sale_total = 0;
            var footer_total_paid = 0;
            var footer_total_remaining = 0;
            var footer_total_sell_return_due = 0;
            var footer_total_item = 0;
            for (var r in data){
                footer_sale_total += $(data[r].final_total).data('orig-value') ? parseFloat($(data[r].final_total).data('orig-value')) : 0;
                footer_total_paid += $(data[r].total_paid).data('orig-value') ? parseFloat($(data[r].total_paid).data('orig-value')) : 0;
                footer_total_remaining += $(data[r].total_remaining).data('orig-value') ? parseFloat($(data[r].total_remaining).data('orig-value')) : 0;
                footer_total_sell_return_due += $(data[r].return_due).find('.sell_return_due').data('orig-value') ? parseFloat($(data[r].return_due).find('.sell_return_due').data('orig-value')) : 0;
                footer_total_item += $(data[r].return_due).find('.total_items').data('orig-value') ? parseFloat($(data[r].total_items).find('.total_items').data('orig-value')) : 0;
            }

            $('.footer_total_sell_return_due').html(__currency_trans_from_en(footer_total_sell_return_due));
            $('.footer_total_remaining').html(__currency_trans_from_en(footer_total_remaining));
            $('.footer_total_paid').html(__currency_trans_from_en(footer_total_paid));
            $('.footer_sale_total').html(__currency_trans_from_en(footer_sale_total));

            $('.footer_payment_status_count').html(__count_status(data, 'payment_status'));
            $('.service_type_count').html(__count_status(data, 'types_of_service_name'));
            $('.payment_method_count').html(__count_status(data, 'payment_methods'));
        },
        createdRow: function( row, data, dataIndex ) {
            $(row).find('td:eq(0)').addClass('selectable_td');        },
        "drawCallback": function( settings ) {
            // Auto-refresh chart after table is loaded/updated
            setTimeout(function() {
                if (sell_table.rows().data().length > 0) {
                    console.log('Table loaded, refreshing chart...');
                    loadSalesChart();
                } else {
                    console.log('Table not loaded yet, waiting...');
                }
            }, 1000);
        },
        "initComplete": function(settings, json) {
            // Chart loads after initial table load
            console.log('DataTable initialized with', json ? json.recordsTotal : 0, 'records');
            setTimeout(function() {
                loadSalesChart();
            }, 1500);
        }
    });

    // Refresh chart button
    $('#refresh_chart_btn').click(function() {
        loadSalesChart();
    });

    $(document).on('change', '#sell_list_filter_location_id, #sell_list_filter_customer_id, #sell_list_filter_payment_status, #created_by, #sales_cmsn_agnt, #service_staffs, #shipping_status, #sell_list_filter_source, #payment_method',  function() {
        sell_table.ajax.reload();
        // Chart will auto-refresh in drawCallback
    });

    $(document).on('click', '#delete-selected-sell', function(e){
                e.preventDefault();
                var selected_rows = getSelectedRows();
                
                if(selected_rows.length > 0){
                    $('input#selected_rows-sell').val(selected_rows);
                    swal({
                        title: LANG.sure,
                        icon: "warning",
                        buttons: true,
                        dangerMode: true,
                    }).then((willDelete) => {
                        if (willDelete) {
                            $('form#mass_delete_form-sell').submit();
                        }
                    });
                } else{
                    $('input#selected_rows-sell').val('');
                    swal('@lang("lang_v1.no_row_selected")');
                }    
    });

    $('#print-selected-invoices-sell').click(function(e) {
        e.preventDefault();
        
        var selected_rows = getSelectedRows();
  

        if(selected_rows.length > 0) {
            $('#selected_rows-sell-print').val(selected_rows);
            $('#bulk_print_invoices_form-sell').submit();
        } else {
            alert('No rows selected for printing.');
        }
    });
    $('#print-selected-invoices-sell-page').click(function(e) {
        e.preventDefault();
        
        var selected_rows = getSelectedRows();
  

        if(selected_rows.length > 0) {
            $('#selected_rows-sell-print-page').val(selected_rows);
            $('#bulk_print_invoices_form-sell-page').submit();
        } else {
            alert('No rows selected for printing.');
        }
    });

    $('#only_subscriptions').on('ifChanged', function(event){
        sell_table.ajax.reload();
    });

    // Function to process server data
    window.processServerData = function(data, groupByMonth) {
        console.log('Processing server data...');
        var chartData = [];
        
        for (var i = 0; i < data.length; i++) {
            var row = data[i];
            
            if (row.transaction_date) {
                // Parse date from server format
                var dateText = row.transaction_date;
                if (typeof dateText === 'string') {
                    dateText = dateText.replace(/<[^>]*>/g, '').trim();
                }
                
                var dateMatch = dateText.match(/(\d{2})-(\d{2})-(\d{4})/);
                if (dateMatch) {
                    var day = parseInt(dateMatch[1]);
                    var month = parseInt(dateMatch[2]) - 1;
                    var year = parseInt(dateMatch[3]);
                    var date = new Date(year, month, day);
                    date.setHours(0, 0, 0, 0);
                    
                    // Get final_total value
                    var value = 0;
                    if (row.final_total) {
                        value = parseFloat(row.final_total) || 0;
                    }
                    
                    if (value > 0) {
                        chartData.push({
                            date: date,
                            value: value
                        });
                    }
                }
            }
        }
        
        console.log('Extracted', chartData.length, 'data points');
        
        // Aggregate by date or month
        var aggregated = {};
        chartData.forEach(function(item) {
            var key;
            if (groupByMonth) {
                var monthDate = new Date(item.date.getFullYear(), item.date.getMonth(), 1);
                key = monthDate.getTime();
            } else {
                key = item.date.getTime();
            }
            
            if (aggregated[key]) {
                aggregated[key] += item.value;
            } else {
                aggregated[key] = item.value;
            }
        });
        
        var finalData = Object.keys(aggregated).map(function(date) {
            return {
                date: parseInt(date),
                value: aggregated[date]
            };
        }).sort(function(a, b) {
            return a.date - b.date;
        });
        
        console.log('Final data points:', finalData.length);
        
        if (finalData.length > 0) {
            renderSalesChart(finalData, groupByMonth);
        } else {
            $('#chartdiv').html('<div style="padding: 20px; text-align: center;"><p>Could not process sales data</p></div>');
        }
    };
    
    // Function to load sales chart
    window.loadSalesChart = function() {
        console.log('=== loadSalesChart() called ===');
        
        // Show loading
        $('#chartdiv').html('<div style="display: flex; align-items: center; justify-content: center; height: 100%;"><i class="fa fa-spinner fa-spin fa-3x"></i></div>');
        
        try {
            // Get filter values
            var start_date = null;
            var end_date = null;
            if($('#sell_list_filter_date_range').val()) {
                start_date = $('#sell_list_filter_date_range').data('daterangepicker').startDate.format('YYYY-MM-DD');
                end_date = $('#sell_list_filter_date_range').data('daterangepicker').endDate.format('YYYY-MM-DD');
            }
            console.log('Date range:', start_date, 'to', end_date);

        var filters = {
            start_date: start_date,
            end_date: end_date,
            location_id: $('#sell_list_filter_location_id').val(),
            customer_id: $('#sell_list_filter_customer_id').val(),
            payment_status: $('#sell_list_filter_payment_status').val(),
            created_by: $('#created_by').val(),
            sales_cmsn_agnt: $('#sales_cmsn_agnt').val(),
            service_staffs: $('#service_staffs').val(),
            payment_method: $('#payment_method').val(),
            shipping_status: $('#shipping_status').length ? $('#shipping_status').val() : null,
            source: $('#sell_list_filter_source').length ? $('#sell_list_filter_source').val() : null,
        };

        // Update date info display
        if (start_date && end_date) {
            $('#chart_date_range_text').text(start_date + ' to ' + end_date);
            $('#chart_date_info').show();
        } else {
            $('#chart_date_range_text').text('All Time');
            $('#chart_date_info').show();
        }

        // Fetch data and render chart - use the same endpoint as the table
        var requestData = {
            start_date: start_date,
            end_date: end_date,
            is_direct_sale: 1,
            location_id: filters.location_id,
            customer_id: filters.customer_id,
            payment_status: filters.payment_status,
            created_by: filters.created_by,
            sales_cmsn_agnt: filters.sales_cmsn_agnt,
            service_staffs: filters.service_staffs,
            payment_method: filters.payment_method,
            shipping_status: filters.shipping_status,
            source: filters.source,
            length: 10000, // Get many records for chart
            start: 0
        };
        
        console.log('Fetching data from /sells with filters:', requestData);
        
        $.ajax({
            url: '/sells',
            method: 'GET',
            data: requestData,
            success: function(response) {
                console.log('SUCCESS! Got response:', response);
                console.log('Response has data:', response.data ? response.data.length : 0, 'records');
                
                var daysDiff = 0;
                if (start_date && end_date) {
                    var startDateObj = new Date(start_date);
                    var endDateObj = new Date(end_date);
                    daysDiff = Math.ceil((endDateObj - startDateObj) / (1000 * 60 * 60 * 24));
                }
                var groupByMonth = daysDiff > 31;
                
                if (response && response.data && response.data.length > 0) {
                    processServerData(response.data, groupByMonth);
                } else {
                    $('#chartdiv').html('<div style="padding: 20px; text-align: center;"><p>Server returned no data</p><button onclick="loadSalesChart()" class="btn btn-sm btn-primary">Retry</button></div>');
                }
            },
            error: function(xhr, status, error) {
                console.error('AJAX ERROR:', status, error);
                console.log('Falling back to table data...');
                var chartData = [];
                var startDateObj = start_date ? new Date(start_date) : null;
                var endDateObj = end_date ? new Date(end_date) : null;
                var daysDiff = 0;
                
                if (startDateObj && endDateObj) {
                    daysDiff = Math.ceil((endDateObj - startDateObj) / (1000 * 60 * 60 * 24));
                }
                
                // Determine if we should group by month or day
                var groupByMonth = daysDiff > 31;
                
                // Get all visible rows from DataTable
                var tableData = sell_table.rows({ page: 'current' }).data();
                console.log('Table rows found:', tableData.length);
                
                for (var i = 0; i < tableData.length; i++) {
                    var row = tableData[i];
                    
                    if (row.transaction_date) {
                        // Try different date formats
                        var dateText = row.transaction_date;
                        
                        // Remove HTML tags if present
                        var tempDiv = document.createElement('div');
                        tempDiv.innerHTML = dateText;
                        dateText = tempDiv.textContent || tempDiv.innerText || dateText;
                        
                        // Match date pattern DD-MM-YYYY
                        var dateMatch = dateText.match(/(\d{2})-(\d{2})-(\d{4})/);
                        
                        if (dateMatch) {
                            var day = parseInt(dateMatch[1]);
                            var month = parseInt(dateMatch[2]) - 1; // JS months are 0-indexed
                            var year = parseInt(dateMatch[3]);
                            var date = new Date(year, month, day);
                            date.setHours(0, 0, 0, 0);
                            
                            // Get value - handle both formats
                            var value = 0;
                            if (row.final_total) {
                                // Try to extract numeric value
                                var totalText = row.final_total;
                                if (typeof totalText === 'string') {
                                    var tempDiv2 = document.createElement('div');
                                    tempDiv2.innerHTML = totalText;
                                    var dataValue = $(tempDiv2).find('[data-orig-value]').data('orig-value');
                                    if (dataValue) {
                                        value = parseFloat(dataValue);
                                    } else {
                                        // Try to parse as number
                                        var numMatch = totalText.match(/([\d,]+\.?\d*)/);  
                                        if (numMatch) {
                                            value = parseFloat(numMatch[1].replace(/,/g, ''));
                                        }
                                    }
                                } else if (typeof totalText === 'number') {
                                    value = totalText;
                                }
                            }
                            
                            if (value > 0) {
                                chartData.push({
                                    date: date,
                                    value: value
                                });
                            }
                        }
                    }
                }
                
                console.log('Chart data extracted:', chartData.length, 'rows');
                
                // If no data from current page, try to use all loaded data
                if (chartData.length === 0) {
                    console.log('No data from current page, trying all data...');
                    var allData = sell_table.rows().data();
                    console.log('All rows:', allData.length);
                    
                    for (var i = 0; i < Math.min(allData.length, 1000); i++) {
                        var row = allData[i];
                        
                        if (row && row.transaction_date) {
                            var dateText = row.transaction_date;
                            var tempDiv = document.createElement('div');
                            tempDiv.innerHTML = dateText;
                            dateText = tempDiv.textContent || tempDiv.innerText || dateText;
                            
                            var dateMatch = dateText.match(/(\d{2})-(\d{2})-(\d{4})/);
                            
                            if (dateMatch) {
                                var day = parseInt(dateMatch[1]);
                                var month = parseInt(dateMatch[2]) - 1;
                                var year = parseInt(dateMatch[3]);
                                var date = new Date(year, month, day);
                                date.setHours(0, 0, 0, 0);
                                
                                var value = 0;
                                if (row.final_total) {
                                    var totalText = row.final_total;
                                    if (typeof totalText === 'string') {
                                        var tempDiv2 = document.createElement('div');
                                        tempDiv2.innerHTML = totalText;
                                        var dataValue = $(tempDiv2).find('[data-orig-value]').data('orig-value');
                                        if (dataValue) {
                                            value = parseFloat(dataValue);
                                        } else {
                                            var numMatch = totalText.match(/([\d,]+\.?\d*)/);  
                                            if (numMatch) {
                                                value = parseFloat(numMatch[1].replace(/,/g, ''));
                                            }
                                        }
                                    } else if (typeof totalText === 'number') {
                                        value = totalText;
                                    }
                                }
                                
                                if (value > 0) {
                                    chartData.push({
                                        date: date,
                                        value: value
                                    });
                                }
                            }
                        }
                    }
                    console.log('After fallback, chart data:', chartData.length, 'rows');
                }

                // Aggregate by date or month
                var aggregated = {};
                chartData.forEach(function(item) {
                    var key;
                    if (groupByMonth) {
                        // Group by month - use first day of month as key
                        var monthDate = new Date(item.date.getFullYear(), item.date.getMonth(), 1);
                        key = monthDate.getTime();
                    } else {
                        // Group by day
                        key = item.date.getTime();
                    }
                    
                    if (aggregated[key]) {
                        aggregated[key] += item.value;
                    } else {
                        aggregated[key] = item.value;
                    }
                });

                var finalData = Object.keys(aggregated).map(function(date) {
                    return {
                        date: parseInt(date),
                        value: aggregated[date]
                    };
                }).sort(function(a, b) {
                    return a.date - b.date;
                });

                console.log('Final aggregated data:', finalData.length, 'points');
                console.log('Sample data:', finalData.slice(0, 3));
                
                if (finalData.length === 0) {
                    // Show debug info
                    var debugMsg = '<div style="padding: 20px; text-align: center;">';
                    debugMsg += '<p style="font-size: 18px; color: #999;">No sales data available</p>';
                    debugMsg += '<p style="font-size: 14px; color: #666;">Debug Info:</p>';
                    debugMsg += '<p style="font-size: 12px;">Table rows on page: ' + sell_table.rows({ page: 'current' }).data().length + '</p>';
                    debugMsg += '<p style="font-size: 12px;">Total table rows: ' + sell_table.rows().data().length + '</p>';
                    debugMsg += '<p style="font-size: 12px;">Raw chart data extracted: ' + chartData.length + '</p>';
                    debugMsg += '<button onclick="loadSalesChart()" class="btn btn-sm btn-primary">Try Again</button>';
                    debugMsg += '</div>';
                    $('#chartdiv').html(debugMsg);
                } else {
                    renderSalesChart(finalData, groupByMonth);
                }
            }
        });
        
        } catch(err) {
            console.error('ERROR in loadSalesChart():', err);
            $('#chartdiv').html('<div style="padding: 20px; text-align: center; color: red;"><p>JavaScript Error:</p><p>' + err.message + '</p><button onclick="loadSalesChart()" class="btn btn-sm btn-primary">Try Again</button></div>');
        }
    };

    // Function to render chart using amCharts
    window.renderSalesChart = function(data, groupByMonth) {
        // Dispose existing chart if any
        if (window.salesChartRoot) {
            window.salesChartRoot.dispose();
        }

        // Create root element
        var root = am5.Root.new("chartdiv");
        window.salesChartRoot = root;

        const myTheme = am5.Theme.new(root);
        myTheme.rule("AxisLabel", ["minor"]).setAll({
            dy: 1
        });
        myTheme.rule("AxisLabel").setAll({
            fontSize: "0.9em"
        });

        // Set themes
        root.setThemes([
            am5themes_Animated.new(root),
            myTheme,
            am5themes_Responsive.new(root)
        ]);

        // Create chart
        var chart = root.container.children.push(am5xy.XYChart.new(root, {
            wheelX: "panX",
            wheelY: "zoomX",
            paddingLeft: 10,
            paddingRight: 20,
            paddingTop: 10,
            paddingBottom: 10,
            layout: root.verticalLayout
        }));

        // Add cursor
        var cursor = chart.set("cursor", am5xy.XYCursor.new(root, {
            behavior: "none"
        }));
        cursor.lineY.set("visible", false);

        // Create axes with appropriate time unit
        var xAxis = chart.xAxes.push(am5xy.DateAxis.new(root, {
            maxDeviation: 0.2,
            baseInterval: {
                timeUnit: groupByMonth ? "month" : "day",
                count: 1
            },
            renderer: am5xy.AxisRendererX.new(root, {
                minorGridEnabled: true,
                minorLabelsEnabled: true,
                minGridDistance: 50
            }),
            tooltip: am5.Tooltip.new(root, {})
        }));

        if (groupByMonth) {
            xAxis.set("dateFormats", {
                "month": "MMM yyyy"
            });
            xAxis.set("periodChangeDateFormats", {
                "month": "MMM yyyy"
            });
        } else {
            xAxis.set("dateFormats", {
                "day": "dd MMM"
            });
            xAxis.set("minorDateFormats", {
                "day": "dd",
                "month": "MMM"
            });
        }

        var yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {
            renderer: am5xy.AxisRendererY.new(root, {
                pan: "zoom"
            })
        }));

        // Add series
        var tooltipFormat = groupByMonth ? 
            "Month: {valueX.formatDate('MMM yyyy')}\nAmount: {valueY}" : 
            "Date: {valueX.formatDate('dd MMM yyyy')}\nAmount: {valueY}";
        
        var series = chart.series.push(am5xy.ColumnSeries.new(root, {
            name: "Sales",
            xAxis: xAxis,
            yAxis: yAxis,
            valueYField: "value",
            valueXField: "date",
            tooltip: am5.Tooltip.new(root, {
                labelText: tooltipFormat
            })
        }));

        series.columns.template.setAll({ 
            cornerRadiusTL: 5, 
            cornerRadiusTR: 5, 
            strokeOpacity: 0 
        });
        
        series.columns.template.adapters.add("fill", function (fill, target) {
            return chart.get("colors").getIndex(series.columns.indexOf(target));
        });

        series.columns.template.adapters.add("stroke", function (stroke, target) {
            return chart.get("colors").getIndex(series.columns.indexOf(target));
        });

        // Set data
        series.data.setAll(data);

        // Make stuff animate on load
        series.appear(1000);
        chart.appear(1000, 100);
    };
});


</script>
<script src="{{ asset('js/payment.js?v=' . $asset_v) }}"></script>
@endsection
