package cc.winboll.studio.contacts.utils;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/08/30 14:32
 * @Describe 联系人工具集
 */
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.utils.ToastUtils;
import java.util.HashMap;
import java.util.Map;

public class ContactUtils {

    public static final String TAG = "ContactUtils";

    Map<String, String> contactMap = new HashMap<>();

    static volatile ContactUtils _ContactUtils;
    Context mContext;
    ContactUtils(Context context) {
        mContext = context;
        relaodContacts();
    }
    public synchronized static ContactUtils getInstance(Context context) {
        if (_ContactUtils == null) {
            _ContactUtils = new ContactUtils(context);
        }
        return _ContactUtils;
    }

    public void relaodContacts() {
        readContacts();
    }

    private void readContacts() {
        contactMap.clear();
        ContentResolver contentResolver = mContext.getContentResolver();
        Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                              null, null, null, null);
        if (cursor != null) {
            while (cursor.moveToNext()) {
                String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                //Map<String, String> contactMap = new HashMap<>();
                contactMap.put(formatToSimplePhoneNumber(phoneNumber), displayName);
            }
            cursor.close();
        }
        // 此时 contactList 就是存储联系人信息的 Map 列表
    }

    public String getContactsName(String phone) {
        String result = contactMap.get(formatToSimplePhoneNumber(phone));
        return result == null ? "[NotInContacts]" : result;
    }

//    static String getSimplePhone(String phone) {
//        return phone.replaceAll("[+\\s]", "");
//    }

    public static String formatToSimplePhoneNumber(String number) {
        // 去除所有空格和非数字字符
        return number.replaceAll("[^0-9]", "");
    }

    public static String getDisplayNameByPhone(Context context, String phoneNumber) {
        String displayName = null;
        ContentResolver resolver = context.getContentResolver();
        String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
        Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{phoneNumber}, null);
        if (cursor != null && cursor.moveToFirst()) {
            displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            cursor.close();
        }
        return displayName;
    }

    public static String getDisplayNameByPhoneSimple(Context context, String phoneNumber) {
        String displayName = null;
        ContentResolver resolver = context.getContentResolver();
        String[] projection = {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
        Cursor cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]{formatToSimplePhoneNumber(phoneNumber)}, null);
        if (cursor != null && cursor.moveToFirst()) {
            displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            cursor.close();
        }
        return displayName;
    }

    public static boolean isPhoneInContacts(Context context, String phoneNumber) {
        String szPhoneNumber = formatToSimplePhoneNumber(phoneNumber);
        String szDisplayName = getDisplayNameByPhone(context, szPhoneNumber);
        if (szDisplayName == null) {
            LogUtils.d(TAG, String.format("Phone %s is not in contacts.", szPhoneNumber));
            szPhoneNumber = formatToSpacePhoneNumber(szPhoneNumber);
            szDisplayName = getDisplayNameByPhone(context, szPhoneNumber);
            if (szDisplayName == null) {
                LogUtils.d(TAG, String.format("Phone %s is not in contacts.", szPhoneNumber));
                return false;
            }
        }
        LogUtils.d(TAG, String.format("Phone %s is found in contacts %s.", szPhoneNumber, szDisplayName));
        return true;
    }

    public static String formatToSpacePhoneNumber(String simpleNumber) {
        // 去除所有空格和非数字字符
        StringBuilder sbSpaceNumber = new StringBuilder();
        String regex = "^1[0-9]{10}$"; 
        if (simpleNumber.matches(regex)) {
            sbSpaceNumber.append(simpleNumber.substring(0, 3));
            sbSpaceNumber.append(" ");
            sbSpaceNumber.append(simpleNumber.substring(3, 7));
            sbSpaceNumber.append(" ");
            sbSpaceNumber.append(simpleNumber.substring(7, 11));
        }
        return sbSpaceNumber.toString();
    }


	/**
	 * 跳转至系统添加联系人界面的工具函数
	 * @param context 上下文（如 PhoneCallService、Activity、Fragment 均可，需传入有效上下文）
	 * @param phoneNumber 可选参数：预填的联系人电话（传 null 则跳转空表单）
	 */
	public static void jumpToAddContact(Context mContext, String phoneNumber) {
		Intent intent = new Intent(Intent.ACTION_INSERT);
		intent.setType("vnd.android.cursor.dir/person");
		intent.putExtra(android.provider.ContactsContract.Intents.Insert.PHONE, phoneNumber);
		mContext.startActivity(intent);
	}

	/**
	 * 跳转至系统编辑联系人界面（适配小米等定制机型）
	 * @param context 上下文（Activity/Service/Fragment）
	 * @param phoneNumber 待编辑联系人的电话号码（用于匹配已有联系人，必传）
	 * @param contactId 可选：已有联系人的ID（通过 ContactsContract 获取，传null则自动匹配号码）
	 */
	public static void jumpToEditContact(Context context, String phoneNumber, Long contactId) {
		Intent intent = new Intent(Intent.ACTION_EDIT);
		// 关键：小米等机型需明确设置数据类型为“单个联系人”，避免参数丢失
		intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE);

		// 场景A：已知联系人ID（精准定位，优先用此方式，参数传递最稳定）
		if (contactId != null && contactId > 0) {
			// 构建联系人的Uri（格式：content://contacts/people/[contactId]，系统标准格式）
			Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
			intent.setData(contactUri);
			//ToastUtils.show("1");
		} else if (phoneNumber != null && !phoneNumber.isEmpty()) {
			// 方式1：小米等机型兼容的“通过号码定位联系人”参数（部分系统认此参数）
			//intent.putExtra(ContactsContract.Intents.Insert.PHONE_NUMBER, phoneNumber);
			// 方式2：补充系统标准的“数据Uri”，强化匹配（避免参数被定制系统忽略）
			Uri phoneUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
			intent.setData(phoneUri);
		} else {
			LogUtils.d(TAG, "编辑联系人失败：电话号码和联系人ID均为空");
			return;
		}

		// 可选：预填最新号码（覆盖原有号码，若用户修改了号码，编辑时自动更新）
		if (phoneNumber != null && !phoneNumber.isEmpty()) {
			intent.putExtra(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber);
			intent.putExtra(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
		}

		// 启动活动（加防护，避免无联系人应用崩溃）
		// 小米机型在Service/非Activity中调用，需加NEW_TASK标志，否则可能无法启动
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(intent);
	}

	/**
	 * 通过电话号码查询联系人ID（适配小米机型，解决编辑时匹配不稳定问题）
	 * @param context 上下文
	 * @param phoneNumber 待查询的电话号码
	 * @return 联系人ID（无匹配时返回-1）
	 */
	public static Long getContactIdByPhone(Context context, String phoneNumber) {
		if (phoneNumber == null || phoneNumber.isEmpty()) {
			return -1L;
		}

		ContentResolver cr = context.getContentResolver();
		// 1. 构建电话查询Uri（系统标准：通过号码过滤联系人数据）
		Uri queryUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
		// 2. 只查询“联系人ID”字段（高效，避免冗余数据）
		String[] projection = {ContactsContract.CommonDataKinds.Phone.CONTACT_ID};
		Cursor cursor = null;

		try {
			cursor = cr.query(queryUri, projection, null, null, null);
			if (cursor != null && cursor.moveToFirst()) {
				// 3. 读取联系人ID（返回Long类型，避免int溢出）
				return cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
			}
		} catch (Exception e) {
			LogUtils.d(TAG, "查询联系人ID失败。" + e);
		} finally {
			if (cursor != null) {
				cursor.close(); // 关闭游标，避免内存泄漏
			}
		}
		return -1L; // 无匹配联系人
	}

}
