package com.example.pmulabs.room.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase
import com.example.pmulabs.room.dao.ArticleDao
import com.example.pmulabs.room.dao.CommentDao
import com.example.pmulabs.room.dao.TagDao
import com.example.pmulabs.room.dao.UserDao
import com.example.pmulabs.room.models.Article
import com.example.pmulabs.room.models.Comment
import com.example.pmulabs.room.models.Tag
import com.example.pmulabs.room.models.User
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.Date


@Database(entities = [User::class, Tag::class, Comment::class, Article::class], version = 5, exportSchema = false)
abstract class NewsPortalDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
    abstract fun tagDao(): TagDao
    abstract fun commentDao(): CommentDao
    abstract fun articleDao(): ArticleDao

    companion object {
        private const val DB_NAME: String = "news-portal"

        @Volatile
        private var INSTANCE: NewsPortalDatabase? = null
        private suspend fun populateDatabase() {
            INSTANCE?.let { database ->
                val userDao = database.userDao()
                val user1 = User(1, "LatinMisha","llmisha@gmail.com","user1","user")
                val user2 = User(2, "Kasablanka","kasyul@gmail.com","user2","user")
                val user3 = User(3, "Ilonherber","ihlon82@gmail.com","user3","user")
                userDao.insert(user1)
                userDao.insert(user2)
                userDao.insert(user3)
                val tagDao = database.tagDao()
                val tag1 = Tag(1, "Тег_1",2)
                val tag2 = Tag(2, "Тег_2",1)
                val tag3 = Tag(3, "Тег_3",3)
                val tag4 = Tag(4, "Тег_4",2)
                val tag5 = Tag(5, "Тег_5",1)
                val tag6 = Tag(6, "Тег_6",3)
                tagDao.insert(tag1)
                tagDao.insert(tag2)
                tagDao.insert(tag3)
                tagDao.insert(tag4)
                tagDao.insert(tag5)
                tagDao.insert(tag6)
                val articleDao = database.articleDao()
                val article1 = Article(1, "Заголовок 1","Текст статьи с заголовком 1", Date(2023,5,22).time,1,6)
                val article2 = Article(2, "Заголовок 2","Текст статьи с заголовком 2", Date(2022,11,13).time,3,2)
                val article3 = Article(3, "Заголовок 3","Текст статьи с заголовком 3", Date(2023,5,4).time,2,1)
                val article4 = Article(4, "Заголовок 4","Текст статьи с заголовком 4", Date(2023,2,14).time,3,3)
                val article5 = Article(5, "Заголовок 5","Текст статьи с заголовком 5", Date(2023,0,19).time,1,4)
                val article6 = Article(6, "Заголовок 6","Текст статьи с заголовком 6", Date(2023,5,22).time,2,4)
                val article7 = Article(7, "Заголовок 7","Текст статьи с заголовком 7", Date(2023,0,19).time,3,5)
                val article8 = Article(8, "Заголовок 8","Текст статьи с заголовком 8", Date(2022,11,13).time,1,6)
                articleDao.insert(article1)
                articleDao.insert(article2)
                articleDao.insert(article3)
                articleDao.insert(article4)
                articleDao.insert(article5)
                articleDao.insert(article6)
                articleDao.insert(article7)
                articleDao.insert(article8)
                val commentDao = database.commentDao()
                val comment1 = Comment(1, "Текст комментария 1",1,8)
                val comment2 = Comment(2, "Текст комментария 2",2,2)
                val comment3 = Comment(3, "Текст комментария 3",3,3)
                val comment4 = Comment(4, "Текст комментария 4",1,4)
                val comment5 = Comment(5, "Текст комментария 5",2,1)
                val comment6 = Comment(6, "Текст комментария 6",3,4)
                val comment7 = Comment(7, "Текст комментария 7",1,6)
                val comment8 = Comment(8, "Текст комментария 8",2,7)
                val comment9 = Comment(9, "Текст комментария 9",3,1)
                val comment10 = Comment(10, "Текст комментария 10",1,2)
                val comment11 = Comment(11, "Текст комментария 11",2,3)
                commentDao.insert(comment1)
                commentDao.insert(comment2)
                commentDao.insert(comment3)
                commentDao.insert(comment4)
                commentDao.insert(comment5)
                commentDao.insert(comment6)
                commentDao.insert(comment7)
                commentDao.insert(comment8)
                commentDao.insert(comment9)
                commentDao.insert(comment10)
                commentDao.insert(comment11)
            }
        }

        fun getInstance(appContext: Context): NewsPortalDatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    appContext,
                    NewsPortalDatabase::class.java,
                    DB_NAME
                )
                    .addCallback(object : Callback() {
                        override fun onCreate(db: SupportSQLiteDatabase) {
                            super.onCreate(db)
                            CoroutineScope(Dispatchers.IO).launch {
                                populateDatabase()
                            }
                        }
                    })
                    .build()
                    .also { INSTANCE = it }
            }
        }
    }
}