package com.lemenzo.contacts;

import android.app.*;
import android.content.*;
import android.os.*;
import android.view.*;
import android.widget.*;

import java.util.*;
import java.util.concurrent.*;

public class DuplicateActivity extends Activity {
    private static final int REQ_CONTACTS=714;
    private final ExecutorService io=Executors.newSingleThreadExecutor(r->new Thread(r,"LemenzoContacts-Duplicates"));
    private final Handler main=new Handler(Looper.getMainLooper());
    private ContactsRepository repo;
    private LinearLayout root, box;
    private volatile boolean destroyed;

    @Override public void onCreate(Bundle b){
        super.onCreate(b);
        repo=new ContactsRepository(this);
        if(!ContactsPermission.hasReadWrite(this)){ContactsPermission.requestReadWrite(this,REQ_CONTACTS);return;}
        buildScreen();
    }

    private void buildScreen(){
        root=new LinearLayout(this);
        root.setOrientation(LinearLayout.VERTICAL);
        root.setBackgroundColor(Ui.BG);
        Ui.applySafeInsets(this,root);
        root.addView(Ui.subHeader(this,getString(R.string.possible_duplicates)));

        ScrollView sv=new ScrollView(this);
        box=new LinearLayout(this);
        box.setOrientation(LinearLayout.VERTICAL);
        box.setPadding(Ui.dp(this,16),0,Ui.dp(this,16),Ui.dp(this,24));
        TextView loading=Ui.text(this,getString(R.string.possible_duplicates),15,Ui.SECONDARY);
        loading.setGravity(Gravity.CENTER);
        box.addView(loading,new LinearLayout.LayoutParams(-1,Ui.dp(this,160)));
        sv.addView(box);
        root.addView(sv,new LinearLayout.LayoutParams(-1,0,1));
        setContentView(root);

        io.execute(()->{
            List<List<ContactSummary>> groups=repo.duplicates();
            main.post(()->{if(!destroyed)render(groups);});
        });
    }

    private void render(List<List<ContactSummary>> groups){
        box.removeAllViews();
        if(groups.isEmpty()){
            TextView e=Ui.text(this,getString(R.string.no_duplicates),15,Ui.SECONDARY);
            e.setGravity(Gravity.CENTER);
            box.addView(e,new LinearLayout.LayoutParams(-1,Ui.dp(this,160)));
            return;
        }
        for(List<ContactSummary> g:groups){
            LinearLayout card=Ui.card(this);
            card.addView(Ui.title(this,getString(R.string.duplicate_match,g.size()),15));
            card.addView(Ui.space(this,8));
            for(ContactSummary c:g){
                TextView row=Ui.text(this,c.name+(c.phone==null||c.phone.isEmpty()?"":"  •  "+c.phone),14,Ui.TEXT);
                row.setPadding(0,Ui.dp(this,9),0,Ui.dp(this,9));
                row.setOnClickListener(v->startActivity(new Intent(this,ContactDetailActivity.class)
                        .putExtra("contact_id",c.id)));
                card.addView(row);
            }
            Button merge=Ui.button(this,getString(R.string.merge_contacts),true);
            merge.setOnClickListener(v->{
                merge.setEnabled(false);
                io.execute(()->{
                    try{
                        repo.mergeLocal(g);
                        main.post(()->{
                            if(destroyed)return;
                            Toast.makeText(this,R.string.contacts_merged,Toast.LENGTH_SHORT).show();
                            recreate();
                        });
                    }catch(Exception e){
                        main.post(()->{
                            if(destroyed)return;
                            merge.setEnabled(true);
                            Toast.makeText(this,R.string.merge_failed,Toast.LENGTH_LONG).show();
                        });
                    }
                });
            });
            card.addView(Ui.space(this,8));
            card.addView(merge);
            box.addView(card);
            box.addView(Ui.space(this,10));
        }
    }

    @Override public void onRequestPermissionsResult(int r,String[] p,int[] g){
        super.onRequestPermissionsResult(r,p,g);
        if(r!=REQ_CONTACTS)return;
        if(ContactsPermission.hasReadWrite(this))buildScreen();
        else{Toast.makeText(this,R.string.contacts_permission_required,Toast.LENGTH_LONG).show();finish();}
    }

    @Override protected void onDestroy(){
        destroyed=true;
        io.shutdownNow();
        super.onDestroy();
    }
}
