import { AbsContact } from 'scriptable-abstract';

/**
 * Interface for contact's email addresses
 */
interface ContactEmailAddress {
    identifier?: string;
    label?: string;
    localizedLabel?: string;
    value: string;
}
/**
 * Interface for contact's phone numbers
 */
interface ContactPhoneNumber {
    identifier?: string;
    label?: string;
    localizedLabel?: string;
    value: string;
}
/**
 * Interface for contact's postal addresses
 */
interface ContactPostalAddress {
    identifier?: string;
    label: string;
    localizedLabel: string;
    street: string;
    city: string;
    state: string;
    postalCode: string;
    country: string;
}
/**
 * Interface for contact's social profiles
 */
interface ContactSocialProfile {
    identifier?: string;
    label: string;
    localizedLabel: string;
    service: string;
    url: string;
    userIdentifier: string;
    username: string;
}
/**
 * State interface for Contact mock
 */
interface ContactState {
    identifier: string;
    namePrefix: string;
    givenName: string;
    middleName: string;
    familyName: string;
    nickname: string;
    birthday: Date | null;
    image: any | null;
    emailAddresses: ContactEmailAddress[];
    phoneNumbers: ContactPhoneNumber[];
    postalAddresses: ContactPostalAddress[];
    socialProfiles: ContactSocialProfile[];
    note: string;
    urlAddresses: Array<{
        [key: string]: string;
    }>;
    dates: Array<{
        [key: string]: any;
    }>;
    organizationName: string;
    departmentName: string;
    jobTitle: string;
    isNamePrefixAvailable: boolean;
    isGiveNameAvailable: boolean;
    isGivenNameAvailable: boolean;
    isMiddleNameAvailable: boolean;
    isFamilyNameAvailable: boolean;
    isNicknameAvailable: boolean;
    isBirthdayAvailable: boolean;
    isEmailAddressesAvailable: boolean;
    isPhoneNumbersAvailable: boolean;
    isPostalAddressesAvailable: boolean;
    isSocialProfilesAvailable: boolean;
    isImageAvailable: boolean;
    isNoteAvailable: boolean;
    isURLAddressesAvailable: boolean;
    isOrganizationNameAvailable: boolean;
    isDepartmentNameAvailable: boolean;
    isJobTitleAvailable: boolean;
    isDatesAvailable: boolean;
}
/**
 * Mock implementation of Scriptable's Contact.
 * Represents a contact in the user's address book.
 */
declare class MockContact extends AbsContact<ContactState> {
    constructor();
    /**
     * _Creates a new contact._
     * @see https://docs.scriptable.app/contact/#new-contact
     */
    static create(): MockContact;
    /**
     * _All contacts in the address book._
     * @see https://docs.scriptable.app/contact/#all
     */
    static all(): Promise<MockContact[]>;
    /**
     * _Contacts matching the specified name._
     * @param name - Name to search for.
     * @see https://docs.scriptable.app/contact/#contactsnamed
     */
    static contactsNamed(_name: string): Promise<MockContact[]>;
    /**
     * _Picks a contact._
     * @see https://docs.scriptable.app/contact/#pickcontact
     */
    static pickContact(): Promise<MockContact | null>;
    /**
     * _Picks multiple contacts._
     * @see https://docs.scriptable.app/contact/#pickcontacts
     */
    static pickContacts(): Promise<MockContact[]>;
    /**
     * _Saves the contact._
     * @see https://docs.scriptable.app/contact/#-save
     */
    save(): Promise<void>;
    /**
     * _Removes the contact._
     * @see https://docs.scriptable.app/contact/#-remove
     */
    remove(): Promise<void>;
    get identifier(): string;
    get namePrefix(): string;
    set namePrefix(value: string);
    get givenName(): string;
    set givenName(value: string);
    get middleName(): string;
    set middleName(value: string);
    get familyName(): string;
    set familyName(value: string);
    get nickname(): string;
    set nickname(value: string);
    get birthday(): Date | null;
    set birthday(value: Date | null);
    get image(): any | null;
    set image(value: any | null);
    get emailAddresses(): ContactEmailAddress[];
    set emailAddresses(value: ContactEmailAddress[]);
    get phoneNumbers(): ContactPhoneNumber[];
    set phoneNumbers(value: ContactPhoneNumber[]);
    get postalAddresses(): ContactPostalAddress[];
    set postalAddresses(value: ContactPostalAddress[]);
    get socialProfiles(): ContactSocialProfile[];
    set socialProfiles(value: ContactSocialProfile[]);
    get note(): string;
    set note(value: string);
    get urlAddresses(): Array<{
        [key: string]: string;
    }>;
    set urlAddresses(value: Array<{
        [key: string]: string;
    }>);
    get dates(): Array<{
        [key: string]: any;
    }>;
    set dates(value: Array<{
        [key: string]: any;
    }>);
    get organizationName(): string;
    set organizationName(value: string);
    get departmentName(): string;
    set departmentName(value: string);
    get jobTitle(): string;
    set jobTitle(value: string);
    get isNamePrefixAvailable(): boolean;
    get isGivenNameAvailable(): boolean;
    get isMiddleNameAvailable(): boolean;
    get isFamilyNameAvailable(): boolean;
    get isNicknameAvailable(): boolean;
    get isBirthdayAvailable(): boolean;
    get isEmailAddressesAvailable(): boolean;
    get isPhoneNumbersAvailable(): boolean;
    get isPostalAddressesAvailable(): boolean;
    get isSocialProfilesAvailable(): boolean;
    get isImageAvailable(): boolean;
    get isNoteAvailable(): boolean;
    get isURLAddressesAvailable(): boolean;
    get isOrganizationNameAvailable(): boolean;
    get isDepartmentNameAvailable(): boolean;
    get isJobTitleAvailable(): boolean;
    get isDatesAvailable(): boolean;
}

export { type ContactEmailAddress, type ContactPhoneNumber, type ContactPostalAddress, type ContactSocialProfile, type ContactState, MockContact };
