package com.lemenzo.messenger;

import android.app.Activity;
import android.app.Dialog;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.lemenzo.messenger.ui.Ui;
import com.lemenzo.messenger.retention.MessageRetentionManager;

public final class SettingsActivity extends Activity {
    public static final String PREFS = "lemenzo_messenger";
    public static final String PREF_DELIVERY_REPORTS = "delivery_reports";
    public static final String PREF_MESSAGE_TEXT_SIZE = "message_text_size";
    public static final String PREF_MESSAGE_RETENTION = "message_retention";
    public static final int DEFAULT_MESSAGE_TEXT_SIZE = 18;
    private SharedPreferences prefs;

    @Override public void onCreate(Bundle state) {
        super.onCreate(state);
        Ui.prepareEdgeToEdge(this);
        prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
        build();
    }

    private void build() {
        LinearLayout root = new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setBackgroundColor(getColor(R.color.lemenzo_settings_background));
        int p = Ui.dp(root, 18);
        root.setPadding(p, Ui.dp(root, 8), p, Ui.dp(root, 20));
        Ui.applySafeInsets(root);

        LinearLayout header = new LinearLayout(this);
        header.setGravity(Gravity.CENTER_VERTICAL);
        ImageButton back = Ui.iconButton(this, R.drawable.ic_back, getString(R.string.navigate_back));
        back.setOnClickListener(v -> finish());
        header.addView(back, new LinearLayout.LayoutParams(Ui.dp(root, 48), Ui.dp(root, 54)));
        TextView title = settingsText(getString(R.string.settings), 24, true, R.color.lemenzo_settings_text_primary);
        header.addView(title, new LinearLayout.LayoutParams(0, Ui.dp(root, 56), 1f));
        root.addView(header);

        ScrollView scroll = new ScrollView(this);
        scroll.setClipToPadding(false);
        LinearLayout content = new LinearLayout(this);
        content.setOrientation(LinearLayout.VERTICAL);
        content.setPadding(0, Ui.dp(root, 8), 0, Ui.dp(root, 20));
        scroll.addView(content, new ScrollView.LayoutParams(-1, -2));

        content.addView(sectionLabel(getString(R.string.settings_section_messaging)));
        LinearLayout messagingGroup = group();
        addToggleRow(messagingGroup, getString(R.string.delivery_reports), getString(R.string.delivery_reports_summary),
                PREF_DELIVERY_REPORTS, false, true);
        addInfoRow(messagingGroup, getString(R.string.message_text_size), getString(R.string.message_text_size_summary), false,
                this::showTextSizeDialog);
        content.addView(messagingGroup, groupParams());

        TextView privacyLabel = sectionLabel(getString(R.string.settings_section_privacy_data));
        LinearLayout.LayoutParams plp = new LinearLayout.LayoutParams(-1, -2);
        plp.setMargins(0, Ui.dp(root, 22), 0, 0);
        content.addView(privacyLabel, plp);
        LinearLayout privacyGroup = group();
        addInfoRow(privacyGroup, getString(R.string.message_retention_title), retentionSummary(), true,
                this::showRetentionDialog);
        addInfoRow(privacyGroup, getString(R.string.privacy), getString(R.string.privacy_summary), false,
                () -> showInfoDialog(getString(R.string.privacy_dialog_title), getString(R.string.privacy_dialog_body)));
        content.addView(privacyGroup, groupParams());

        TextView appLabel = sectionLabel(getString(R.string.settings_section_app));
        LinearLayout.LayoutParams alp = new LinearLayout.LayoutParams(-1, -2);
        alp.setMargins(0, Ui.dp(root, 22), 0, 0);
        content.addView(appLabel, alp);
        LinearLayout info = group();
        addInfoRow(info, getString(R.string.about), getString(R.string.about_summary), false,
                () -> showInfoDialog(getString(R.string.about), getString(R.string.about_dialog_body)));
        content.addView(info, groupParams());

        root.addView(scroll, new LinearLayout.LayoutParams(-1, 0, 1f));
        setContentView(root);
    }

    public static float messageTextSize(android.content.Context context) {
        int value = context.getSharedPreferences(PREFS, MODE_PRIVATE)
                .getInt(PREF_MESSAGE_TEXT_SIZE, DEFAULT_MESSAGE_TEXT_SIZE);
        if (value < 16) value = 16;
        if (value > 22) value = 22;
        return value;
    }

    public static float conversationPreviewTextSize(android.content.Context context) {
        return Math.max(14f, messageTextSize(context) - 3f);
    }

    private String retentionSummary() {
        String value = prefs.getString(PREF_MESSAGE_RETENTION, MessageRetentionManager.OFF);
        return MessageRetentionManager.OFF.equals(value)
                ? getString(R.string.message_retention_off_summary)
                : getString(R.string.message_retention_active_summary, retentionLabel(value));
    }

    private String retentionLabel(String value) {
        if ("24h".equals(value)) return getString(R.string.retention_24_hours);
        if ("2d".equals(value)) return getString(R.string.retention_2_days);
        if ("4d".equals(value)) return getString(R.string.retention_4_days);
        if ("7d".equals(value)) return getString(R.string.retention_7_days);
        if ("14d".equals(value)) return getString(R.string.retention_14_days);
        return getString(R.string.retention_off);
    }

    private void showRetentionDialog() {
        final String[] values = {"off", "24h", "2d", "4d", "7d", "14d"};
        final String[] labels = {
                getString(R.string.retention_off), getString(R.string.retention_24_hours),
                getString(R.string.retention_2_days), getString(R.string.retention_4_days),
                getString(R.string.retention_7_days), getString(R.string.retention_14_days)};
        String current = prefs.getString(PREF_MESSAGE_RETENTION, MessageRetentionManager.OFF);

        Dialog dialog = createLemenzoDialog();
        LinearLayout card = dialogCard();
        card.addView(dialogTitle(getString(R.string.message_retention_title)));
        TextView explanation = settingsText(getString(R.string.message_retention_dialog_explanation), 14, false,
                R.color.lemenzo_settings_text_secondary);
        explanation.setLineSpacing(0f, 1.12f);
        LinearLayout.LayoutParams ep = new LinearLayout.LayoutParams(-1, -2);
        ep.setMargins(0, Ui.dp(card, 8), 0, Ui.dp(card, 14));
        card.addView(explanation, ep);

        for (int i = 0; i < values.length; i++) {
            final String value = values[i];
            boolean selected = value.equals(current);
            LinearLayout row = choiceRow(labels[i], selected);
            row.setOnClickListener(v -> {
                prefs.edit().putString(PREF_MESSAGE_RETENTION, value).apply();
                MessageRetentionManager.apply(this, value);
                dialog.dismiss();
                build();
            });
            card.addView(row);
            if (i < values.length - 1) addDialogDivider(card);
        }
        card.addView(dialogCancel(dialog));
        dialog.setContentView(card);
        showLemenzoDialog(dialog);
    }

    private void showTextSizeDialog() {
        final int[] sizes = {16, 18, 20, 22};
        String[] labels = {
                getString(R.string.text_size_small), getString(R.string.text_size_standard),
                getString(R.string.text_size_large), getString(R.string.text_size_extra_large)};
        int current = prefs.getInt(PREF_MESSAGE_TEXT_SIZE, DEFAULT_MESSAGE_TEXT_SIZE);

        Dialog dialog = createLemenzoDialog();
        LinearLayout card = dialogCard();
        card.addView(dialogTitle(getString(R.string.message_text_size)));
        for (int i = 0; i < sizes.length; i++) {
            final int size = sizes[i];
            LinearLayout row = choiceRow(labels[i], size == current);
            row.setOnClickListener(v -> {
                prefs.edit().putInt(PREF_MESSAGE_TEXT_SIZE, size).apply();
                dialog.dismiss();
            });
            card.addView(row);
            if (i < sizes.length - 1) addDialogDivider(card);
        }
        card.addView(dialogCancel(dialog));
        dialog.setContentView(card);
        showLemenzoDialog(dialog);
    }

    private TextView sectionLabel(String value) {
        TextView t = settingsText(value, 12, true, R.color.lemenzo_settings_blue);
        t.setLetterSpacing(0.08f);
        t.setPadding(Ui.dp(t, 14), Ui.dp(t, 10), 0, Ui.dp(t, 7));
        return t;
    }

    private LinearLayout group() {
        LinearLayout g = new LinearLayout(this);
        g.setOrientation(LinearLayout.VERTICAL);
        g.setBackgroundResource(R.drawable.settings_group_background);
        g.setPadding(0, Ui.dp(g, 2), 0, Ui.dp(g, 2));
        return g;
    }

    private LinearLayout.LayoutParams groupParams() { return new LinearLayout.LayoutParams(-1, -2); }

    private void addToggleRow(LinearLayout parent, String titleText, String subtitle, String key, boolean defaultValue, boolean divider) {
        LinearLayout row = new LinearLayout(this);
        row.setGravity(Gravity.CENTER_VERTICAL);
        row.setPadding(Ui.dp(row, 16), Ui.dp(row, 15), Ui.dp(row, 14), Ui.dp(row, 15));
        row.setClickable(true); row.setFocusable(true);

        LinearLayout text = new LinearLayout(this); text.setOrientation(LinearLayout.VERTICAL);
        TextView title = settingsText(titleText, 16, true, R.color.lemenzo_settings_text_primary); text.addView(title);
        TextView summary = settingsText(subtitle, 13, false, R.color.lemenzo_settings_text_secondary);
        summary.setMaxLines(3);
        LinearLayout.LayoutParams slp = new LinearLayout.LayoutParams(-1, -2); slp.setMargins(0, Ui.dp(row, 5), 0, 0);
        text.addView(summary, slp); row.addView(text, new LinearLayout.LayoutParams(0, -2, 1f));

        TextView state = settingsText("", 12, true, R.color.lemenzo_settings_text_primary); Ui.center(state);
        refreshToggle(state, key, defaultValue);
        LinearLayout.LayoutParams stateParams = new LinearLayout.LayoutParams(Ui.dp(row, 62), Ui.dp(row, 34));
        stateParams.setMargins(Ui.dp(row, 16), 0, 0, 0); row.addView(state, stateParams);
        row.setOnClickListener(v -> {
            boolean next = !prefs.getBoolean(key, defaultValue);
            prefs.edit().putBoolean(key, next).apply();
            refreshToggle(state, key, defaultValue);
        });
        parent.addView(row, new LinearLayout.LayoutParams(-1, -2));
        if (divider) addDivider(parent);
    }

    private void refreshToggle(TextView state, String key, boolean defaultValue) {
        boolean enabled = prefs.getBoolean(key, defaultValue);
        state.setText(enabled ? getString(R.string.delivery_reports_on) : getString(R.string.delivery_reports_off));
        state.setTextColor(getColor(enabled ? R.color.lemenzo_settings_text_primary : R.color.lemenzo_settings_text_secondary));
        state.setBackgroundResource(enabled ? R.drawable.settings_toggle_on : R.drawable.settings_toggle_off);
    }

    private void addInfoRow(LinearLayout parent, String titleText, String subtitle, boolean divider, Runnable action) {
        LinearLayout row = new LinearLayout(this); row.setOrientation(LinearLayout.VERTICAL);
        row.setPadding(Ui.dp(row, 16), Ui.dp(row, 14), Ui.dp(row, 16), Ui.dp(row, 14));
        row.setClickable(true); row.setFocusable(true); row.setOnClickListener(v -> action.run());
        TextView title = settingsText(titleText, 16, true, R.color.lemenzo_settings_text_primary); row.addView(title);
        TextView summary = settingsText(subtitle, 13, false, R.color.lemenzo_settings_text_secondary); summary.setMaxLines(3);
        LinearLayout.LayoutParams slp = new LinearLayout.LayoutParams(-1, -2); slp.setMargins(0, Ui.dp(row, 5), 0, 0);
        row.addView(summary, slp); parent.addView(row, new LinearLayout.LayoutParams(-1, -2));
        if (divider) addDivider(parent);
    }

    private void addDivider(LinearLayout parent) {
        View d = new View(this); d.setBackgroundColor(getColor(R.color.lemenzo_settings_divider));
        LinearLayout.LayoutParams dlp = new LinearLayout.LayoutParams(-1, Ui.dp(parent, 1));
        dlp.setMargins(Ui.dp(parent, 16), 0, 0, 0); parent.addView(d, dlp);
    }

    private void showInfoDialog(String title, String message) {
        Dialog dialog = createLemenzoDialog();
        LinearLayout card = dialogCard();
        card.addView(dialogTitle(title));
        TextView body = settingsText(message, 14, false, R.color.lemenzo_settings_text_secondary);
        body.setLineSpacing(0f, 1.14f);
        LinearLayout.LayoutParams bp = new LinearLayout.LayoutParams(-1, -2);
        bp.setMargins(0, Ui.dp(card, 10), 0, Ui.dp(card, 4));
        card.addView(body, bp);
        TextView ok = dialogAction(getString(android.R.string.ok));
        ok.setOnClickListener(v -> dialog.dismiss());
        card.addView(ok);
        dialog.setContentView(card);
        showLemenzoDialog(dialog);
    }

    private Dialog createLemenzoDialog() {
        Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        return dialog;
    }

    private LinearLayout dialogCard() {
        LinearLayout card = new LinearLayout(this);
        card.setOrientation(LinearLayout.VERTICAL);
        card.setPadding(Ui.dp(card, 22), Ui.dp(card, 20), Ui.dp(card, 22), Ui.dp(card, 16));
        card.setBackgroundResource(R.drawable.settings_dialog_background);
        return card;
    }

    private TextView dialogTitle(String title) {
        return settingsText(title, 20, true, R.color.lemenzo_settings_text_primary);
    }

    private LinearLayout choiceRow(String label, boolean selected) {
        LinearLayout row = new LinearLayout(this);
        row.setGravity(Gravity.CENTER_VERTICAL);
        row.setPadding(Ui.dp(row, 14), Ui.dp(row, 13), Ui.dp(row, 10), Ui.dp(row, 13));
        row.setBackgroundResource(selected ? R.drawable.settings_choice_selected : R.drawable.settings_choice_normal);
        TextView text = settingsText(label, 16, selected, selected ? R.color.lemenzo_settings_text_primary : R.color.lemenzo_settings_text_secondary);
        row.addView(text, new LinearLayout.LayoutParams(0, -2, 1f));
        TextView mark = settingsText(selected ? "✓" : "", 20, true, R.color.lemenzo_settings_blue);
        mark.setGravity(Gravity.CENTER);
        row.addView(mark, new LinearLayout.LayoutParams(Ui.dp(row, 36), Ui.dp(row, 36)));
        return row;
    }

    private void addDialogDivider(LinearLayout parent) {
        View d = new View(this);
        d.setBackgroundColor(getColor(R.color.lemenzo_settings_divider));
        parent.addView(d, new LinearLayout.LayoutParams(-1, Ui.dp(parent, 1)));
    }

    private TextView dialogCancel(Dialog dialog) {
        TextView cancel = dialogAction(getString(android.R.string.cancel));
        cancel.setOnClickListener(v -> dialog.dismiss());
        return cancel;
    }

    private TextView dialogAction(String label) {
        TextView action = settingsText(label, 14, true, R.color.lemenzo_settings_blue);
        action.setGravity(Gravity.END | Gravity.CENTER_VERTICAL);
        action.setPadding(Ui.dp(action, 12), Ui.dp(action, 14), Ui.dp(action, 8), Ui.dp(action, 6));
        return action;
    }

    private TextView settingsText(String value, float sp, boolean bold, int colorRes) {
        TextView t = Ui.text(this, value, sp, bold);
        t.setTextColor(getColor(colorRes));
        return t;
    }

    private void showLemenzoDialog(Dialog dialog) {
        Window window = dialog.getWindow();
        if (window != null) {
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
            WindowManager.LayoutParams params = window.getAttributes();
            params.dimAmount = 0.72f;
            window.setAttributes(params);
        }
        dialog.show();
        window = dialog.getWindow();
        if (window != null) {
            float density = getResources().getDisplayMetrics().density;
            int sideMargin = Math.round(36f * density);
            int maxWidth = Math.round(520f * density);
            int width = Math.min(getResources().getDisplayMetrics().widthPixels - sideMargin, maxWidth);
            window.setLayout(width, WindowManager.LayoutParams.WRAP_CONTENT);
        }
    }
}
