package com.myls.odes.data

import android.os.Parcel
import android.os.Parcelable
import com.myls.odes.utility.Storage
import java.util.*

/**
 * Created by myls on 12/8/17.
 *
 * UserList
 */
data class UserList(val list: MutableList<User> = mutableListOf())
    : Parcelable
    , Storage.Storable
{
    // Parcel

    constructor(parcel: Parcel) : this(
        mutableListOf<User>().apply {
            parcel.readList(this, User::class.java.classLoader)
        })

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeList(list)

        // [Kotlin parcelable and arrayList of parcelables]
        // (https://stackoverflow.com/a/45459675)
    }
    override fun describeContents() = 0
    companion object CREATOR : Parcelable.Creator<UserList> {
        override fun createFromParcel(parcel: Parcel) = UserList(parcel)
        override fun newArray(size: Int) = arrayOfNulls<UserList>(size)
    }

    // data class

    data class User(
        val info: Info,
        var freq: Int = 1,
        var date: Long = Calendar.getInstance().timeInMillis,
        val dorm: Dorm = Dorm()): Parcelable
    {
        // Parcel

        constructor(parcel: Parcel) : this(
            parcel.readParcelable(User::class.java.classLoader),
            parcel.readInt(),
            parcel.readLong(),
            parcel.readParcelable(Dorm::class.java.classLoader))
        override fun writeToParcel(parcel: Parcel, flags: Int) {
            parcel.writeParcelable(info, flags)
            parcel.writeInt(freq)
            parcel.writeLong(date)
            parcel.writeParcelable(dorm, flags)
        }
        override fun describeContents() = 0
        companion object CREATOR : Parcelable.Creator<User> {
            override fun createFromParcel(parcel: Parcel) = User(parcel)
            override fun newArray(size: Int) = arrayOfNulls<User>(size)
        }
    }

    data class Dorm(
        var pick: String = "",
        val fris: MutableList<Friend> = mutableListOf()) : Parcelable
    {
        // Parcel

        constructor(parcel: Parcel) : this(
            parcel.readString(),
            mutableListOf<Friend>().apply {
                parcel.readList(this, Friend::class.java.classLoader)
            })
        override fun writeToParcel(parcel: Parcel, flags: Int) {
            parcel.writeString(pick)
            parcel.writeList(fris)
        }
        override fun describeContents() = 0
        companion object CREATOR : Parcelable.Creator<Dorm> {
            override fun createFromParcel(parcel: Parcel) = Dorm(parcel)
            override fun newArray(size: Int) = arrayOfNulls<Dorm>(size)
        }

        // data class

        data class Friend(
            var stid: String,
            var code: String) : Parcelable
        {
            // Parcel

            constructor(parcel: Parcel) : this(
                parcel.readString(),
                parcel.readString())
            override fun writeToParcel(parcel: Parcel, flags: Int) {
                parcel.writeString(stid)
                parcel.writeString(code)
            }
            override fun describeContents() = 0
            companion object CREATOR : Parcelable.Creator<Friend> {
                override fun createFromParcel(parcel: Parcel) = Friend(parcel)
                override fun newArray(size: Int) = arrayOfNulls<Friend>(size)
            }
        }
    }

    data class Info(
        val stid: String,
        var name: String = "",
        var gender: String = "",
        var grade: String = "",
        var code: String = "",
        var room: String = "",
        var building: String = "",
        var location: String = ""): Parcelable
    {
        // Parcel

        constructor(parcel: Parcel) : this(
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString(),
            parcel.readString())
        override fun writeToParcel(parcel: Parcel, flags: Int) {
            parcel.writeString(stid)
            parcel.writeString(name)
            parcel.writeString(gender)
            parcel.writeString(grade)
            parcel.writeString(code)
            parcel.writeString(room)
            parcel.writeString(building)
            parcel.writeString(location)
        }
        override fun describeContents() = 0
        companion object CREATOR : Parcelable.Creator<Info> {
            override fun createFromParcel(parcel: Parcel) = Info(parcel)
            override fun newArray(size: Int) = arrayOfNulls<Info>(size)
        }
    }
}
