#!/bin/bash

CONF_PATH="$HOME/.config/evolution/sources"
SERVER_URL="owa.mos.ru"
EWS_URL="https://owa.mos.ru/EWS/Exchange.asmx"
AUTH_METHOD="NTLM"
EWS_PORT="443"

setup_kwin_rule() {
    local RULE_FILE="$HOME/.config/kwinrulesrc"

    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "Description" "Параметры для mostech-postprofile-gui"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "desktopfile" "mostech-postprofile-gui"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "desktopfilerule" "2"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "ignoregeometry" "true"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "ignoregeometryrule" "2"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "placementrule" "2"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "title" "Evolution|Действия|Добавление|Очистка|Просмотр|Сброс|Список|Удаление"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "titlematch" "3"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "types" "33"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "wmclass" "kdialog|org.kde.kdialog"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "wmclasscomplete" "true"
    kwriteconfig5 --file "$RULE_FILE" --group "1" --key "wmclassmatch" "3"
    kwriteconfig5 --file "$RULE_FILE" --group "General" --key "count" "1"

    qdbus org.kde.KWin /KWin reconfigure

    sleep 0.5
}

setup_kwin_rule

check_dependencies() {
    local missing_deps=()

    if ! rpm -q evolution &>/dev/null; then
        missing_deps+=("Evolution (почтовый клиент)")
    fi

    if ! rpm -q evolution-ews &>/dev/null; then
        missing_deps+=("Evolution EWS (плагин для работы с Exchange)")
    fi

    if [ ${#missing_deps[@]} -gt 0 ]; then
        local deps_list=$(printf "\n• %s" "${missing_deps[@]}")
        kdialog --error "Отсутствуют необходимые компоненты:$deps_list\n\nОбратитесь в техническую поддержку:\nтел.: 75555 (внутренний)\nтел.: +7 (495) 989-80-25 (городской)" \
            --title "Настройка почты - Evolution"
        exit 1
    fi
}

check_dependencies

list_accounts() {
    if [ ! -d "$CONF_PATH" ]; then
        kdialog --sorry "Действующая конфигурация Evolution не найдена." --title "Настройка почты - Evolution"
        return
    fi

    declare -A unique_accounts
    declare -A account_files_map

    for file_path in "$CONF_PATH"/*.source; do
        display_name=$(grep -h 'DisplayName=' "$file_path" | cut -d'=' -f2)
        if [[ "$display_name" == *@*.mos.ru ]]; then
            if [ -z "${unique_accounts[$display_name]}" ]; then
                unique_accounts[$display_name]=1
                account_files_map[$display_name]="$file_path"
            else
                account_files_map[$display_name]="${account_files_map[$display_name]}:$file_path"
            fi
        fi
    done

    if [ ${#unique_accounts[@]} -eq 0 ]; then
        kdialog --sorry "Учетные записи не найдены." --title "Настройка почты - Evolution"
    else
        menu_options=()
        index=1
        for account in "${!unique_accounts[@]}"; do
            menu_options+=("$index" "$account")
            index=$((index + 1))
        done

        selected_index=$(kdialog --menu "Выберите учетную запись" "${menu_options[@]}" --title "Список учетных записей" --geometry 360x320)
        if [ -n "$selected_index" ]; then
            selected_email="${menu_options[$((selected_index*2-1))]}"
            account_actions "$selected_email" "${account_files_map[$selected_email]}"
        fi
    fi
}

account_actions() {
    local account_name="$1"
    local account_files="$2"

    action=$(kdialog --menu "Выберите действие для $account_name" \
        1 "Удалить учетную запись" \
        2 "Просмотреть настройки" \
        3 "Очистить кэш" \
        --title "Действия для учетной записи" --geometry 360x320)

    case $action in
        1) delete_account "$account_files" ;;
        2) view_settings "$account_name" "$account_files" ;;
        3) clean_account_cache "$account_name" "$account_files" ;;
        *) kdialog --sorry "Операция отменена." --title "Действия для учетной записи" ;;
    esac
}

delete_account() {
    local account_files="$1"

    IFS=':' read -ra files <<< "$account_files"
    for file in "${files[@]}"; do
        rm -f "$file"
    done

    kdialog --msgbox "Учетная запись удалена." --title "Удаление учетной записи"
}

view_settings() {
    local account_name="$1"
    local account_files="$2"

    while true; do
        IFS=':' read -ra files <<< "$account_files"
        menu_options=()
        index=1
        for file in "${files[@]}"; do
            filename=$(basename "$file")
            menu_options+=("$index" "$filename")
            index=$((index + 1))
        done

        selected_index=$(kdialog --menu "Выберите файл конфигурации" \
            "${menu_options[@]}" \
            --title "Просмотр настроек" --geometry 360x320)

        if [ -z "$selected_index" ]; then
            break
        fi

        selected_file="${files[$((selected_index-1))]}"
        kdialog --textbox "$selected_file" --title "Просмотр файла - $(basename "$selected_file")" --geometry 580x480
    done
}

clean_account_cache() {
    local account_name="$1"
    local account_files="$2"

    kdialog --warningcontinuecancel \
        "Вы собираетесь очистить кэш учетной записи $account_name\n\n\
Это действие приведет к следующим последствиям:\n\
• Удаление локальной копии писем\n\
• Удаление загруженных вложений\n\
• Удаление временных файлов\n\n\
После очистки Evolution заново загрузит данные с сервера.\n\
Письма и вложения на почтовом сервере останутся без изменений.\n\n\
Продолжить?" \
        --title "Очистка кэша"

    if [ $? -eq 0 ]; then
        pkill -15 evolution 2>/dev/null

        IFS=':' read -ra files <<< "$account_files"
        for file in "${files[@]}"; do
            if grep -q "Parent=" "$file"; then
                local source_id=$(basename "$file" .source)
                if [ -d "$HOME/.cache/evolution/mail/$source_id" ]; then
                    rm -rf "$HOME/.cache/evolution/mail/$source_id"
                fi
            fi
        done

        kdialog --msgbox "Кэш учетной записи $account_name успешно очищен.\n\nПри следующем запуске Evolution заново загрузит данные с сервера." \
            --title "Очистка кэша"
    else
        kdialog --sorry "Операция отменена." --title "Очистка кэша"
    fi
}

generate_unique_filename() {
    local random_name
    local filepath
    while true; do
        random_name="0-ews-$RANDOM"
        filepath="$CONF_PATH/$random_name.source"
        if [[ ! -f "$filepath" ]]; then
            touch "$filepath"
            echo "$random_name"
            return 0
        fi
    done
}

add_account() {
    email_address=$(kdialog --inputbox "Введите адрес электронной почты ГИС ЕПС ПМ (например, primerovpp@it.mos.ru):" --title "Добавление учетной записи")
    if [ $? -ne 0 ] || [ -z "$email_address" ]; then
        kdialog --sorry "Операция отменена или указан неверный адрес электронной почты." --title "Добавление учетной записи"
        return
    fi

    if ! [[ "$email_address" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.mos\.ru$ ]]; then
        kdialog --error "Неверный формат адреса электронной почты." --title "Добавление учетной записи"
        return
    fi

    login=$(echo "$email_address" | awk -F '@' '{print $1}')
    display_name="$email_address"

    mkdir -p "$CONF_PATH"

    local parent_name=$(generate_unique_filename)
    local rand_name1=$(generate_unique_filename)
    local rand_name2=$(generate_unique_filename)
    local rand_name3=$(generate_unique_filename)

    file_path="$CONF_PATH/$parent_name.source"
    cat << EOF > "$file_path"
[Data Source]
DisplayName=$display_name
Enabled=true
Parent=
Populated=false

[Offline]
StaySynchronized=true

[Authentication]
Host=$SERVER_URL
Method=$AUTH_METHOD
Port=$EWS_PORT
ProxyUid=system-proxy
RememberPassword=true
User=$login
CredentialName=$login
IsExternal=false

[Collection]
BackendName=ews
CalendarEnabled=true
ContactsEnabled=true
Identity=$login
MailEnabled=true
CalendarUrl=
ContactsUrl=
AllowSourcesRename=true

[Security]
Method=none

[Ews Backend]
FilterInbox=true
StoreChangesInterval=3
LimitByAge=false
LimitUnit=years
LimitValue=1
CheckAll=true
ListenNotifications=true
Email=$email_address
FilterJunk=true
FilterJunkInbox=false
GalUid=
Hosturl=$EWS_URL
Oaburl=
OabOffline=false
OalSelected=
Timeout=120
UseImpersonation=false
ImpersonateUser=
OverrideUserAgent=false
UserAgent=Microsoft Office/15.0 (Windows NT 10.0; Microsoft Outlook 15.0.4420; Pro)
OverrideOauth2=true
Oauth2Tenant=common
Oauth2ClientId=
Oauth2RedirectUri=
Oauth2ResourceUri=
Oauth2EndpointHost=
ShowPublicFolders=true
ConcurrentConnections=1
SyncTagStamp=0
EOF

    file_path2="$CONF_PATH/$rand_name1.source"
    cat << EOF > "$file_path2"
[Data Source]
DisplayName=$display_name
Enabled=true
Parent=$parent_name
Populated=true

[Refresh]
Enabled=true
IntervalMinutes=1

[Mail Account]
BackendName=ews
IdentityUid=$rand_name1
ArchiveFolder=folder://$parent_name/%d0%90%d1%80%d1%85%d0%b8%d0%b2
NeedsInitialSetup=false
MarkSeen=inconsistent
MarkSeenTimeout=1500

[Exchange Web Services Folder]
ChangeKey=
Id=
Foreign=false
ForeignSubfolders=false
ForeignMail=
FreebusyWeeksBefore=1
FreebusyWeeksAfter=5
Public=false
UsePrimaryAddress=false
FetchGalPhotos=false
Name=

[Authentication]
Host=
Method=none
Port=0
ProxyUid=system-proxy
RememberPassword=true
User=$login
CredentialName=
IsExternal=false
EOF

    file_path3="$CONF_PATH/$rand_name2.source"
    cat << EOF > "$file_path3"
[Data Source]
DisplayName=$display_name
Enabled=true
Parent=$parent_name
Populated=false

[Mail Composition]
Bcc=
Cc=
DraftsFolder=folder://$rand_name1/%d0%a7%d0%b5%d1%80%d0%bd%d0%be%d0%b2%d0%b8%d0%ba%d0%b8
ReplyStyle=default
SignImip=true
TemplatesFolder=folder://$rand_name1/%d0%a8%d0%b0%d0%b1%d0%bb%d0%be%d0%bd%d1%8b
StartBottom=inconsistent
TopSignature=inconsistent
Language=

[Mail Identity]
Address=$email_address
Aliases=
Name=$display_name
Organization=
ReplyTo=
SignatureUid=

[Mail Submission]
SentFolder=folder://$rand_name1/%d0%9e%d1%82%d0%bf%d1%80%d0%b0%d0%b2%d0%bb%d0%b5%d0%bd%d0%bd%d1%8b%d0%b5
TransportUid=$rand_name3
RepliesToOriginFolder=false
UseSentFolder=true

[Pretty Good Privacy (OpenPGP)]
AlwaysTrust=false
EncryptToSelf=true
KeyId=
SigningAlgorithm=
SignByDefault=false
EncryptByDefault=false
PreferInline=false

[Message Disposition Notifications]
ResponsePolicy=ask

[Secure MIME (S/MIME)]
EncryptionCertificate=
EncryptByDefault=false
EncryptToSelf=true
SigningAlgorithm=
SigningCertificate=
SignByDefault=false

[Exchange Web Services Folder]
ChangeKey=
Id=
Foreign=false
ForeignSubfolders=false
ForeignMail=
FreebusyWeeksBefore=1
FreebusyWeeksAfter=5
Name=
Public=false
UsePrimaryAddress=false
FetchGalPhotos=true
EOF

    file_path4="$CONF_PATH/$rand_name3.source"
    cat << EOF > "$file_path4"
[Data Source]
DisplayName=$display_name
Enabled=true
Parent=$parent_name
Populated=true

[Mail Transport]
BackendName=ews

[Exchange Web Services Folder]
ChangeKey=
Id=
Foreign=false
ForeignSubfolders=false
ForeignMail=
FreebusyWeeksBefore=1
FreebusyWeeksAfter=5
Name=
Public=false
UsePrimaryAddress=false
FetchGalPhotos=true
EOF

    kdialog --msgbox "Учетная запись добавлена в почтовый клиент Evolution." --title "Добавление учетной записи"
}

reset_evolution() {
    kdialog --warningcontinuecancel \
        "Вы собираетесь сбросить настройки почтового клиента Evolution.\n\n\
Это действие приведет к следующим последствиям:\n\
• Удаление всех учетных записей\n\
• Сброс текущих настроек программы\n\
• Удаление локальной копии писем\n\n\
После сброса потребуется заново добавить учетные записи.\n\
Письма и вложения на почтовом сервере останутся без изменений.\n\n\
Продолжить?" \
        --title "Сброс настроек клиента"

    if [ $? -eq 0 ]; then
        pkill -15 evolution 2>/dev/null

        rm -rf "$HOME/.config/evolution" 2>/dev/null
        rm -rf "$HOME/.local/share/evolution" 2>/dev/null
        rm -rf "$HOME/.cache/evolution" 2>/dev/null

        kdialog --msgbox "Настройки Evolution успешно сброшены.\n\nТеперь вы можете:\n• Добавить новую учетную запись\n• Запустить Evolution для начальной настройки" \
            --title "Сброс настроек клиента"
    else
        kdialog --sorry "Операция отменена." --title "Сброс настроек клиента"
    fi
}

while true; do
    action=$(kdialog --menu "Выберите необходимое действие" \
        1 "Список учетных записей" \
        2 "Добавить учетную запись" \
        3 "Сбросить настройки клиента" \
        --title "Настройка почты - Evolution" \
        --geometry 360x320)

    if [ -z "$action" ]; then
        break
    fi

    case $action in
        1) list_accounts ;;
        2) add_account ;;
        3) reset_evolution ;;
        *) kdialog --sorry "Операция отменена." --title "Настройка почты - Evolution" ;;
    esac
done