package com.lemenzo.multisms;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.text.InputType;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.LinkedHashMap;

public final class EditGroupActivity extends Activity {
    private static final int REQ_CONTACTS = 51;

    GroupStore store;
    long gid;
    EditText name;
    LinearLayout members;
    final LinkedHashMap<String, GroupStore.Member> selected = new LinkedHashMap<>();

    public void onCreate(Bundle b) {
        super.onCreate(b);
        store = new GroupStore(this);
        gid = getIntent().getLongExtra("group_id", 0);
        if (gid > 0) {
            for (GroupStore.Member m : store.members(gid)) {
                selected.put(m.number, m);
            }
        }
        render();
    }

    void render() {
        ScrollView sv = new ScrollView(this);
        LinearLayout r = Ui.root(this);
        sv.addView(r);

        TextView t = Ui.text(this,
                gid > 0 ? getString(R.string.edit_group) : getString(R.string.create_group),
                25, true);
        r.addView(t);

        Ui.gap(this, r, 16);
        name = Ui.input(this, getString(R.string.group_name));
        if (gid > 0) name.setText(store.groupName(gid));
        r.addView(name);

        Ui.gap(this, r, 12);
        Button contacts = Ui.button(this, getString(R.string.add_members));
        contacts.setOnClickListener(v -> pickContacts());
        r.addView(contacts);

        Ui.gap(this, r, 10);
        Button manual = Ui.secondaryButton(this, getString(R.string.manual_number));
        manual.setOnClickListener(v -> manual());
        r.addView(manual);

        Ui.gap(this, r, 16);
        members = new LinearLayout(this);
        members.setOrientation(LinearLayout.VERTICAL);
        r.addView(members);

        Ui.gap(this, r, 16);
        Button save = Ui.button(this, getString(R.string.save_group));
        save.setOnClickListener(v -> save());
        r.addView(save);

        if (gid > 0) {
            Ui.gap(this, r, 10);
            Button del = Ui.dangerButton(this, getString(R.string.delete_group));
            del.setOnClickListener(v -> confirmDelete());
            r.addView(del);
        }

        setContentView(sv);
        refresh();
    }

    void refresh() {
        members.removeAllViews();

        TextView c = Ui.text(this, getString(R.string.selected_count, selected.size()), 14, true);
        c.setTextColor(getColor(R.color.lemenzo_blue));
        members.addView(c);

        for (GroupStore.Member m : new ArrayList<>(selected.values())) {
            LinearLayout row = Ui.card(this);

            TextView title = Ui.text(this,
                    m.name == null || m.name.isEmpty() ? m.number : m.name,
                    16, true);
            row.addView(title);

            if (m.name != null && !m.name.isEmpty() && !m.name.equals(m.number)) {
                TextView number = Ui.text(this, m.number, 13, false);
                number.setTextColor(getColor(R.color.lemenzo_text_secondary));
                row.addView(number);
            }

            TextView remove = Ui.text(this, getString(R.string.tap_to_remove), 12, false);
            remove.setTextColor(getColor(R.color.lemenzo_text_muted));
            row.addView(remove);

            row.setOnClickListener(v -> {
                selected.remove(m.number);
                refresh();
            });

            members.addView(row);
            Ui.gap(this, members, 8);
        }
    }

    void manual() {
        EditText e = Ui.input(this, getString(R.string.phone_number));
        e.setInputType(InputType.TYPE_CLASS_PHONE);

        Ui.DialogParts dialog = Ui.showDialog(
                this,
                getString(R.string.manual_number),
                getString(R.string.manual_number_hint),
                e,
                getString(R.string.cancel),
                getString(R.string.add),
                false);

        dialog.positive.setOnClickListener(v -> {
            String n = GroupStore.normalize(e.getText().toString());
            if (n.length() < 3) {
                Toast.makeText(this, R.string.invalid_number, Toast.LENGTH_SHORT).show();
                return;
            }
            if (selected.containsKey(n)) {
                Toast.makeText(this, R.string.duplicate_number, Toast.LENGTH_SHORT).show();
                return;
            }
            selected.put(n, new GroupStore.Member(-1, -1, n, n));
            dialog.dialog.dismiss();
            refresh();
        });
    }

    void confirmDelete() {
        Ui.DialogParts dialog = Ui.showDialog(
                this,
                getString(R.string.delete_group_title),
                getString(R.string.delete_group_message),
                null,
                getString(R.string.cancel),
                getString(R.string.delete_group),
                true);

        dialog.positive.setOnClickListener(v -> {
            store.delete(gid);
            dialog.dialog.dismiss();
            finish();
        });
    }

    void pickContacts() {
        if (checkSelfPermission(Manifest.permission.READ_CONTACTS)
                != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, 50);
            return;
        }

        int size = selected.size();
        String[] names = new String[size];
        String[] numbers = new String[size];
        long[] ids = new long[size];
        int i = 0;
        for (GroupStore.Member m : selected.values()) {
            names[i] = m.name;
            numbers[i] = m.number;
            ids[i] = m.contactDataId;
            i++;
        }

        Intent intent = new Intent(this, MultiContactPickerActivity.class)
                .putExtra(MultiContactPickerActivity.EXTRA_SELECTED_NAMES, names)
                .putExtra(MultiContactPickerActivity.EXTRA_SELECTED_NUMBERS, numbers)
                .putExtra(MultiContactPickerActivity.EXTRA_SELECTED_DATA_IDS, ids);
        startActivityForResult(intent, REQ_CONTACTS);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode != REQ_CONTACTS || resultCode != RESULT_OK || data == null) return;

        String[] names = data.getStringArrayExtra(MultiContactPickerActivity.EXTRA_SELECTED_NAMES);
        String[] numbers = data.getStringArrayExtra(MultiContactPickerActivity.EXTRA_SELECTED_NUMBERS);
        long[] ids = data.getLongArrayExtra(MultiContactPickerActivity.EXTRA_SELECTED_DATA_IDS);

        selected.clear();
        if (numbers != null) {
            for (int i = 0; i < numbers.length; i++) {
                String number = GroupStore.normalize(numbers[i]);
                if (number.isEmpty()) continue;
                String contactName = names != null && i < names.length ? names[i] : number;
                long dataId = ids != null && i < ids.length ? ids[i] : -1;
                selected.put(number, new GroupStore.Member(-1, dataId, contactName, number));
            }
        }
        refresh();
    }

    public void onRequestPermissionsResult(int r, String[] p, int[] g) {
        super.onRequestPermissionsResult(r, p, g);
        if (r == 50 && g.length > 0 && g[0] == PackageManager.PERMISSION_GRANTED) {
            pickContacts();
        } else {
            Toast.makeText(this, R.string.contacts_permission, Toast.LENGTH_LONG).show();
        }
    }

    void save() {
        String n = name.getText().toString().trim();
        if (n.isEmpty()) {
            name.requestFocus();
            return;
        }
        if (gid == 0) gid = store.create(n);
        else store.rename(gid, n);

        store.replaceMembers(gid, selected.values());
        finish();
    }
}
