/**
 * CREATE TABLE Contact
 * (
 * Id INTEGER PRIMARY KEY AUTOINCREMENT,
 * QQ TEXT,
 * Gender INTEGER,
 * Mark TEXT,
 * Name TEXT,
 * Phone TEXT,
 * Relation INTEGER,
 * Status INTEGER,
 * Changed INTEGER
 * )
 */
package net.qiujuer.tips.factory.model.db;


import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
import com.raizlabs.android.dbflow.annotation.Column;
import com.raizlabs.android.dbflow.annotation.OneToMany;
import com.raizlabs.android.dbflow.annotation.PrimaryKey;
import com.raizlabs.android.dbflow.annotation.Table;
import com.raizlabs.android.dbflow.sql.language.SQLite;
import com.raizlabs.android.dbflow.structure.BaseModel;

import net.qiujuer.tips.factory.model.adapter.ContactViewModel;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Table(database = AppDatabase.class, name = "Contact")
public class ContactModel extends BaseModel implements ModelStatus {
    public final static int GENDER_MAN = 1;
    public final static int GENDER_WOMAN = 0;

    public ContactModel() {
        super();
        changedTime = System.currentTimeMillis();
        create = new Date(changedTime);
        last = create;
        status = STATUS_ADD;
    }

    @PrimaryKey(autoincrement = true)
    @Column(name = "Id")
    @Expose
    private long id;

    /**
     * 标识
     */
    @SerializedName("Id")
    @Column(name = "Mark", typeConverter = UUIDConverter.class)
    private UUID mark;

    @SerializedName("Name")
    @Column(name = "Name")
    private String name;

    @SerializedName("Phone")
    @Column(name = "Phone")
    private String phone;

    @SerializedName("QQ")
    @Column(name = "QQ")
    private String QQNumber;

    @SerializedName("Create")
    @Column(name = "Created")
    private Date create;

    @SerializedName("Last")
    @Column(name = "Last")
    private Date last;

    @SerializedName("Sex")
    @Column(name = "Sex")
    private int sex;

    @SerializedName("Relation")
    @Column(name = "Relation")
    private int relation;

    @Expose
    @Column(name = "Status")
    private int status;

    @Expose
    @Column(name = "ChangedTime")
    private long changedTime;

    @Expose
    List<RecordModel> recordModels;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Date getCreate() {
        return create;
    }

    public Date getLast() {
        return last;
    }

    public UUID getMark() {
        return mark;
    }

    public void setStatus(int status) {
        this.status = status;
        this.changedTime = System.currentTimeMillis();
    }

    public int getStatus() {
        return status;
    }

    public boolean isDelete() {
        return status == STATUS_DELETE;
    }

    public boolean isEdit() {
        return status == STATUS_EDIT;
    }

    public boolean isAdd() {
        return status == STATUS_ADD;
    }

    public boolean isSynced() {
        return (status == STATUS_UPLOADED);
    }

    public String getName() {
        return name;
    }

    public void setMark(UUID id) {
        this.mark = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setCreate(Date create) {
        this.create = create;
    }

    public void setLast(Date last) {
        this.last = last;
        this.changedTime = last.getTime();
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getQQNumber() {
        return QQNumber;
    }

    public void setQQNumber(String QQNumber) {
        this.QQNumber = QQNumber;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getRelation() {
        return relation;
    }

    public void setRelation(int relation) {
        this.relation = relation;
    }

    public int getColor() {
        return ContactViewModel.getNameColor(name);
    }

    public long getChangedTime() {
        return changedTime;
    }

    public void setChangedTime(long changedTime) {
        this.changedTime = changedTime;
    }


    public static ContactModel get(UUID id) {
        // Mark = ?
        return SQLite.select()
                .from(ContactModel.class)
                .where(ContactModel_Table.Mark.is(id))
                .querySingle();
    }

    public static ContactModel get(long id) {
        //Id = ?
        return SQLite.select()
                .from(ContactModel.class)
                .where(ContactModel_Table.Id.is(id))
                .querySingle();
    }

    public static List<ContactModel> getAll() {
        // Status <> ?
        return SQLite.select()
                .from(ContactModel.class)
                .where(ContactModel_Table.Status.isNot(STATUS_DELETE))
                .queryList();
    }

    public static List<ContactModel> getAllUnSync() {
        // Status <> ?
        return SQLite.select()
                .from(ContactModel.class)
                .where(ContactModel_Table.Status.isNot(STATUS_UPLOADED))
                .queryList();
    }

    public static List<ContactModel> getAllChanged(long date) {
        // Changed > ?
        return SQLite.select()
                .from(ContactModel.class)
                .where(ContactModel_Table.ChangedTime.greaterThan(date))
                .queryList();
    }


    @OneToMany(methods = {OneToMany.Method.ALL}, variableName = "recordModels")
    public List<RecordModel> records() {
        // get recordModels is this.Id
        if (recordModels == null || recordModels.isEmpty()) {
            recordModels = SQLite.select()
                    .from(RecordModel.class)
                    .where(RecordModel_Table.contact_Id.eq(id))
                    .and(RecordModel_Table.Status.isNot(STATUS_DELETE))
                    .queryList();
        }
        return recordModels;
    }
}