package com.lemenzo.multisms;
import android.content.*;import android.database.Cursor;import android.database.sqlite.*;import android.telephony.PhoneNumberUtils;import java.util.*;
final class GroupStore extends SQLiteOpenHelper {
 static final class Group {long id;String name;int count;Group(long i,String n,int c){id=i;name=n;count=c;}}
 static final class Member {long id,contactDataId;String name,number;Member(long i,long d,String n,String p){id=i;contactDataId=d;name=n;number=p;}}
 GroupStore(Context c){super(c,"lemenzo_multi_sms.db",null,2);}
 public void onCreate(SQLiteDatabase db){db.execSQL("CREATE TABLE groups(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)");db.execSQL("CREATE TABLE members(_id INTEGER PRIMARY KEY AUTOINCREMENT,group_id INTEGER NOT NULL,contact_data_id INTEGER NOT NULL DEFAULT -1,name TEXT,number TEXT NOT NULL,UNIQUE(group_id,number) ON CONFLICT IGNORE)");}
 public void onUpgrade(SQLiteDatabase db,int o,int n){if(o<2)db.execSQL("ALTER TABLE members ADD COLUMN contact_data_id INTEGER NOT NULL DEFAULT -1");}
 long create(String name){ContentValues v=new ContentValues();v.put("name",name);return getWritableDatabase().insertOrThrow("groups",null,v);}
 void rename(long id,String name){ContentValues v=new ContentValues();v.put("name",name);getWritableDatabase().update("groups",v,"_id=?",new String[]{Long.toString(id)});}
 void delete(long id){SQLiteDatabase d=getWritableDatabase();d.delete("members","group_id=?",new String[]{Long.toString(id)});d.delete("groups","_id=?",new String[]{Long.toString(id)});}
 void add(long gid,long dataId,String name,String number){String x=normalize(number);if(x.isEmpty())return;ContentValues v=new ContentValues();v.put("group_id",gid);v.put("contact_data_id",dataId);v.put("name",name);v.put("number",x);getWritableDatabase().insert("members",null,v);}
 void clearMembers(long gid){getWritableDatabase().delete("members","group_id=?",new String[]{Long.toString(gid)});}
 void replaceMembers(long gid,Collection<Member> members){SQLiteDatabase db=getWritableDatabase();db.beginTransaction();try{db.delete("members","group_id=?",new String[]{Long.toString(gid)});for(Member m:members){String x=normalize(m.number);if(x.isEmpty())continue;ContentValues v=new ContentValues();v.put("group_id",gid);v.put("contact_data_id",m.contactDataId);v.put("name",m.name);v.put("number",x);db.insert("members",null,v);}db.setTransactionSuccessful();}finally{db.endTransaction();}}
 List<Group> groups(){ArrayList<Group>a=new ArrayList<>();try(Cursor c=getReadableDatabase().rawQuery("SELECT g._id,g.name,COUNT(m._id) FROM groups g LEFT JOIN members m ON m.group_id=g._id GROUP BY g._id ORDER BY g.name COLLATE NOCASE",null)){while(c.moveToNext())a.add(new Group(c.getLong(0),c.getString(1),c.getInt(2)));}return a;}
 List<Member> members(long gid){ArrayList<Member>a=new ArrayList<>();try(Cursor c=getReadableDatabase().query("members",new String[]{"_id","contact_data_id","name","number"},"group_id=?",new String[]{Long.toString(gid)},null,null,"name COLLATE NOCASE,number")){while(c.moveToNext())a.add(new Member(c.getLong(0),c.getLong(1),c.getString(2),c.getString(3)));}return a;}
 String groupName(long gid){try(Cursor c=getReadableDatabase().query("groups",new String[]{"name"},"_id=?",new String[]{Long.toString(gid)},null,null,null)){return c.moveToFirst()?c.getString(0):"";}}
 static String normalize(String n){if(n==null)return "";String x=PhoneNumberUtils.normalizeNumber(n);return x==null?"":x.trim();}
}