package com.android.dialer.app.settings;

import android.app.Dialog;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.android.dialer.app.R;
import com.android.dialer.app.calllog.CallHistoryRetentionManager;

/** Premium LemenzoOS call-history privacy settings. */
public final class CallHistorySettingsFragment extends PreferenceFragment
    implements SharedPreferences.OnSharedPreferenceChangeListener {

  private SharedPreferences preferences;
  private TextView retentionSummary;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    preferences = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext());
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ScrollView scroll = new ScrollView(getActivity());
    scroll.setBackgroundColor(color(R.color.lemenzo_settings_background));
    scroll.setClipToPadding(false);

    LinearLayout content = new LinearLayout(getActivity());
    content.setOrientation(LinearLayout.VERTICAL);
    content.setPadding(dp(18), dp(12), dp(18), dp(28));
    scroll.addView(content, new ScrollView.LayoutParams(-1, -2));

    content.addView(sectionLabel(getString(R.string.lemenzo_settings_section_privacy_data)));

    LinearLayout group = new LinearLayout(getActivity());
    group.setOrientation(LinearLayout.VERTICAL);
    group.setPadding(0, dp(2), 0, dp(2));
    group.setBackground(cardBackground());

    LinearLayout row = new LinearLayout(getActivity());
    row.setOrientation(LinearLayout.VERTICAL);
    row.setPadding(dp(16), dp(16), dp(16), dp(16));
    row.setClickable(true);
    row.setFocusable(true);

    TextView title = text(getString(R.string.lemenzo_call_history_retention_title), 16, true,
        R.color.lemenzo_settings_text_primary);
    row.addView(title);

    retentionSummary = text(retentionSummaryText(), 13, false, R.color.lemenzo_settings_text_secondary);
    retentionSummary.setLineSpacing(0f, 1.10f);
    LinearLayout.LayoutParams summaryLp = new LinearLayout.LayoutParams(-1, -2);
    summaryLp.setMargins(0, dp(6), 0, 0);
    row.addView(retentionSummary, summaryLp);
    row.setOnClickListener(v -> showRetentionDialog());
    group.addView(row, new LinearLayout.LayoutParams(-1, -2));
    content.addView(group, new LinearLayout.LayoutParams(-1, -2));

    TextView explanation = text(getString(R.string.lemenzo_call_history_retention_description), 13,
        false, R.color.lemenzo_settings_text_secondary);
    explanation.setLineSpacing(0f, 1.12f);
    LinearLayout.LayoutParams explanationLp = new LinearLayout.LayoutParams(-1, -2);
    explanationLp.setMargins(dp(14), dp(12), dp(14), 0);
    content.addView(explanation, explanationLp);

    return scroll;
  }

  @Override
  public void onResume() {
    super.onResume();
    preferences.registerOnSharedPreferenceChangeListener(this);
    updateSummary();
  }

  @Override
  public void onPause() {
    preferences.unregisterOnSharedPreferenceChangeListener(this);
    super.onPause();
  }

  @Override
  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (!CallHistoryRetentionManager.PREF_KEY.equals(key)) return;
    String value = sharedPreferences.getString(CallHistoryRetentionManager.PREF_KEY,
        CallHistoryRetentionManager.OFF);
    updateSummary();
    CallHistoryRetentionManager.applySetting(getActivity().getApplicationContext(), value);
  }

  private void updateSummary() {
    if (retentionSummary != null) retentionSummary.setText(retentionSummaryText());
  }

  private String retentionSummaryText() {
    String value = preferences.getString(CallHistoryRetentionManager.PREF_KEY,
        CallHistoryRetentionManager.OFF);
    if (CallHistoryRetentionManager.OFF.equals(value)) {
      return getString(R.string.lemenzo_call_history_retention_off_summary);
    }
    return getString(R.string.lemenzo_call_history_retention_active_summary, retentionLabel(value));
  }

  private String retentionLabel(String value) {
    if ("24h".equals(value)) return getString(R.string.lemenzo_retention_24_hours);
    if ("2d".equals(value)) return getString(R.string.lemenzo_retention_2_days);
    if ("4d".equals(value)) return getString(R.string.lemenzo_retention_4_days);
    if ("7d".equals(value)) return getString(R.string.lemenzo_retention_7_days);
    if ("14d".equals(value)) return getString(R.string.lemenzo_retention_14_days);
    return getString(R.string.lemenzo_retention_off);
  }

  private void showRetentionDialog() {
    final String[] values = {"off", "24h", "2d", "4d", "7d", "14d"};
    final String[] labels = {
        getString(R.string.lemenzo_retention_off),
        getString(R.string.lemenzo_retention_24_hours),
        getString(R.string.lemenzo_retention_2_days),
        getString(R.string.lemenzo_retention_4_days),
        getString(R.string.lemenzo_retention_7_days),
        getString(R.string.lemenzo_retention_14_days)};
    String current = preferences.getString(CallHistoryRetentionManager.PREF_KEY,
        CallHistoryRetentionManager.OFF);

    Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);

    LinearLayout card = new LinearLayout(getActivity());
    card.setOrientation(LinearLayout.VERTICAL);
    card.setPadding(dp(20), dp(20), dp(20), dp(14));
    card.setBackground(dialogBackground());

    TextView title = text(getString(R.string.lemenzo_call_history_retention_title), 20, true,
        R.color.lemenzo_settings_text_primary);
    card.addView(title);

    TextView explanation = text(getString(R.string.lemenzo_call_history_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, dp(8), 0, dp(14));
    card.addView(explanation, ep);

    for (int i = 0; i < values.length; i++) {
      final String value = values[i];
      LinearLayout choice = choiceRow(labels[i], value.equals(current));
      choice.setOnClickListener(v -> {
        preferences.edit().putString(CallHistoryRetentionManager.PREF_KEY, value).apply();
        dialog.dismiss();
        updateSummary();
      });
      card.addView(choice);
      if (i < values.length - 1) card.addView(divider());
    }

    TextView cancel = text(getString(android.R.string.cancel), 14, true, R.color.lemenzo_settings_blue);
    cancel.setGravity(Gravity.CENTER);
    cancel.setPadding(dp(12), dp(14), dp(12), dp(10));
    cancel.setOnClickListener(v -> dialog.dismiss());
    card.addView(cancel, new LinearLayout.LayoutParams(-1, -2));

    dialog.setContentView(card);
    Window window = dialog.getWindow();
    if (window != null) {
      window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
      window.setDimAmount(0.72f);
      window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
      WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
      lp.copyFrom(window.getAttributes());
      lp.width = Math.min(getResources().getDisplayMetrics().widthPixels - dp(36), dp(520));
      lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
      window.setAttributes(lp);
    }
    dialog.show();
    if (window != null) {
      WindowManager.LayoutParams lp = window.getAttributes();
      lp.width = Math.min(getResources().getDisplayMetrics().widthPixels - dp(36), dp(520));
      lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
      window.setAttributes(lp);
    }
  }

  private LinearLayout choiceRow(String label, boolean selected) {
    LinearLayout row = new LinearLayout(getActivity());
    row.setGravity(Gravity.CENTER_VERTICAL);
    row.setPadding(dp(14), dp(13), dp(12), dp(13));
    row.setBackground(choiceBackground(selected));

    TextView labelView = text(label, 15, selected, R.color.lemenzo_settings_text_primary);
    row.addView(labelView, new LinearLayout.LayoutParams(0, -2, 1f));
    TextView mark = text(selected ? "✓" : "", 18, true, R.color.lemenzo_settings_blue);
    mark.setGravity(Gravity.CENTER);
    row.addView(mark, new LinearLayout.LayoutParams(dp(32), dp(32)));
    return row;
  }

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

  private TextView text(String value, float size, boolean bold, int colorRes) {
    TextView t = new TextView(getActivity());
    t.setText(value);
    t.setTextSize(size);
    t.setTextColor(color(colorRes));
    if (bold) t.setTypeface(Typeface.DEFAULT, Typeface.BOLD);
    return t;
  }

  private View divider() {
    View d = new View(getActivity());
    d.setBackgroundColor(color(R.color.lemenzo_settings_blue_outline));
    d.setAlpha(0.70f);
    d.setLayoutParams(new LinearLayout.LayoutParams(-1, dp(1)));
    return d;
  }

  private GradientDrawable cardBackground() {
    GradientDrawable g = new GradientDrawable();
    g.setColor(color(R.color.lemenzo_settings_surface_raised));
    g.setCornerRadius(dp(16));
    g.setStroke(dp(1), color(R.color.lemenzo_settings_blue_outline));
    return g;
  }

  private GradientDrawable dialogBackground() {
    GradientDrawable g = new GradientDrawable();
    g.setColor(color(R.color.lemenzo_settings_surface));
    g.setCornerRadius(dp(22));
    g.setStroke(dp(1), color(R.color.lemenzo_settings_blue_outline));
    return g;
  }

  private GradientDrawable choiceBackground(boolean selected) {
    GradientDrawable g = new GradientDrawable();
    g.setColor(color(selected ? R.color.lemenzo_settings_surface_pressed
        : R.color.lemenzo_settings_surface_raised));
    g.setCornerRadius(dp(12));
    if (selected) g.setStroke(dp(1), color(R.color.lemenzo_settings_blue));
    return g;
  }

  private int color(int id) {
    return getResources().getColor(id);
  }

  private int dp(int value) {
    return Math.round(value * getResources().getDisplayMetrics().density);
  }
}
