import { Controller } from 'stimulus';

import daterangepicker from 'daterangepicker'
import 'daterangepicker/daterangepicker.css'

/*
 * This is an example Stimulus controller!
 *
 * Any element with a data-controller="datePicker" attribute will cause
 * this controller to be executed. The name "hello" comes from the filename:
 * datePicker_controller.js -> "datePicker"
 *
 * Delete this file or adapt it for your use!
 */
export default class extends Controller {
    connect() {
        var locale = {
            format: 'DD.MM.YYYY',
            "applyLabel": "Ок",
            "cancelLabel": "Отмена",
            "fromLabel": "От",
            "toLabel": "До",
            "customRangeLabel": "Произвольный",
            "daysOfWeek": [
                "Вс",
                "Пн",
                "Вт",
                "Ср",
                "Чт",
                "Пт",
                "Сб"
            ],
            "monthNames": [
                "Январь",
                "Февраль",
                "Март",
                "Апрель",
                "Май",
                "Июнь",
                "Июль",
                "Август",
                "Сентябрь",
                "Октябрь",
                "Ноябрь",
                "Декабрь"
            ],
            firstDay: 1
        };

        var date = new Date();
        var lastDate = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 7);
        
        // Получаем значение даты из URL параметра или из атрибута value элемента
        let currentDateValue = this.element.value || this.element.getAttribute('value');
        
        // Если значение не установлено, пробуем получить из URL
        if (!currentDateValue || currentDateValue.trim() === '') {
            const urlParams = new URLSearchParams(window.location.search);
            currentDateValue = urlParams.get('specialist_search[current_date]') || 
                             urlParams.get('specialist_search%5Bcurrent_date%5D') ||
                             decodeURIComponent(urlParams.get('specialist_search%5Bcurrent_date%5D') || '');
        }

        if (this.element.getAttribute('range') == 'true') {
            let startDate = date;
            let endDate = lastDate;
            
            // Если есть значение из URL или value, парсим его
            if (currentDateValue && currentDateValue.trim() !== '') {
                const dateRange = this.parseDateRange(currentDateValue);
                if (dateRange && dateRange.start && dateRange.end) {
                    startDate = dateRange.start;
                    endDate = dateRange.end;
                }
            }
            
            // Форматируем даты для daterangepicker (формат DD.MM.YYYY)
            const formattedStart = window.dateFormat(startDate, 'd.m.Y');
            const formattedEnd = window.dateFormat(endDate, 'd.m.Y');
            
            const picker = jQuery(this.element).daterangepicker({
                locale: locale,
                "startDate": formattedStart,
                "endDate": formattedEnd
            }, function(start, end, label) {
                // Callback при изменении даты
            });
            
            // Устанавливаем значение в поле после инициализации
            // daterangepicker автоматически форматирует значение согласно locale.format
            // Используем setTimeout чтобы дать время daterangepicker инициализироваться
            setTimeout(() => {
                if (currentDateValue && currentDateValue.trim() !== '') {
                    this.element.value = currentDateValue.trim();
                } else {
                    this.element.value = `${formattedStart} - ${formattedEnd}`;
                }
            }, 100);
        } else {
            let selectedDate = date;
            
            // Если есть значение, парсим его
            if (currentDateValue && currentDateValue.trim() !== '') {
                const parsedDate = this.parseSingleDate(currentDateValue);
                if (parsedDate) {
                    selectedDate = parsedDate;
                    this.element.value = currentDateValue;
                }
            }
            
            jQuery(this.element).daterangepicker({
                singleDatePicker: true,
                autoApply: true,
                showDropdowns: true,
                minYear: 1930,
                maxYear: new Date(),
                locale: locale,
                "startDate": window.dateFormat(selectedDate, 'd-m-Y')
            });
        }
    }
    
    parseDateRange(dateString) {
        if (!dateString) return null;
        
        // Парсим формат "13.01.2026 - 20.01.2026" или "13.01.2026+-+20.01.2026"
        const match = dateString.match(/^(.+?)\s*[-+]\s*(.+)$/);
        if (!match) return null;
        
        const startStr = match[1].trim();
        const endStr = match[2].trim();
        
        const startDate = this.parseDateString(startStr);
        const endDate = this.parseDateString(endStr);
        
        if (!startDate || !endDate) return null;
        
        return { start: startDate, end: endDate };
    }
    
    parseSingleDate(dateString) {
        if (!dateString) return null;
        return this.parseDateString(dateString.trim());
    }
    
    parseDateString(dateStr) {
        if (!dateStr) return null;
        
        // Формат "dd.mm.yyyy"
        const match = dateStr.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/);
        if (match) {
            const day = parseInt(match[1], 10);
            const month = parseInt(match[2], 10) - 1; // месяцы в JS начинаются с 0
            const year = parseInt(match[3], 10);
            return new Date(year, month, day);
        }
        
        // Формат "yyyy-mm-dd"
        const match2 = dateStr.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/);
        if (match2) {
            const year = parseInt(match2[1], 10);
            const month = parseInt(match2[2], 10) - 1;
            const day = parseInt(match2[3], 10);
            return new Date(year, month, day);
        }
        
        // Пробуем стандартный парсинг
        const parsed = new Date(dateStr);
        if (!isNaN(parsed.getTime())) {
            return parsed;
        }
        
        return null;
    }
}
