package xyz.adjutor.aniki.presentation.view.anime import android.os.Bundle import android.widget.ImageView import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.google.gson.GsonBuilder import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import xyz.adjutor.aniki.R import xyz.adjutor.aniki.data.anime.AnimeApi import xyz.adjutor.aniki.presentation.model.anime.AnimeResponse class DetailSearchAnimeActivity : AppCompatActivity() { private var baseUrl = "https://api.jikan.moe/" private val gson = GsonBuilder() .setLenient() .create() //used in the list private val intentAnimeImageUrl = "theanimeimageurl" private val intentAnimeTitle = "theanimetitle" private val intentAnimeScore = "theanimescore" //only used for the detail private val intentAnimeId = "theanimeid" private val intentAnimeUrl = "theanimeurl" private val intentAnimeEpisodes = "theanimeepisodes" private val intentAnimeStartDate = "theanimestartdate" private val intentAnimeEndDate = "theanimeenddate" override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_detail_search_anime) val animeImageUrl = intent.getStringExtra(intentAnimeImageUrl) val animeTitle = intent.getStringExtra(intentAnimeTitle) val animeScore = intent.getStringExtra(intentAnimeScore) val animeId = intent.getStringExtra(intentAnimeId) val animeUrl = intent.getStringExtra(intentAnimeUrl) val animeEpisodes = intent.getStringExtra(intentAnimeEpisodes) val animeStartDate = intent.getStringExtra(intentAnimeStartDate) val animeEndDate = intent.getStringExtra(intentAnimeEndDate) val ivImage: ImageView = findViewById(R.id.iv_detail_image) val tvTitle: TextView = findViewById(R.id.tv_detail_title) val tvScore: TextView = findViewById(R.id.tv_detail_score) val tvId: TextView = findViewById(R.id.tv_detail_id) val tvUrl: TextView = findViewById(R.id.tv_url) val tvEpisodes: TextView = findViewById(R.id.tv_episodes) val tvStartDate: TextView = findViewById(R.id.tv_start_date) val tvEndDate: TextView = findViewById(R.id.tv_end_date) Glide .with(this) .load(animeImageUrl) .apply(RequestOptions().override(400)) .into(ivImage) tvTitle.text = animeTitle tvScore.text = animeScore tvId.text = animeId tvUrl.text = animeUrl //using null as a string because it has been converted to a string before tvEpisodes.text = if (animeEpisodes != "null") { animeEpisodes } else { fieldIsNull() } tvStartDate.text = splitDate(animeStartDate!!) tvEndDate.text = if (animeEndDate != "null") { splitDate(animeEndDate!!) } else { fieldIsNull() } makeApiCall(baseUrl, animeId.toString()) } private fun splitDate(animeDate: String): CharSequence { val delimiter = "T" return animeDate .split(delimiter) //split between the date and the time .toTypedArray()[0] //convert it to an array and take the first string } private fun makeApiCall( BASE_URL: String, animeId: String ) { //we take the rest of the data that we need from the internet val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .build() val service = retrofit.create(AnimeApi::class.java) val call = service.getAnimeData(animeId) //based on the id call.enqueue(object : Callback { override fun onResponse( call: Call, response: Response ) { if (response.isSuccessful && response.body() != null) { //if the code returned is >= 200 and < 300 AND the the body ain't empty val anime = response.body() //getting the AnimeResponse fields showDetail(anime!!) } else { showError("API ERROR : is not successful") } } override fun onFailure(call: Call, t: Throwable) { showError("API ERROR : onFailure") } }) } private fun showDetail(anime: AnimeResponse) { //elements from AnimeResponse val tvSynopsis: TextView = findViewById(R.id.tv_synopsis) val tvRank: TextView = findViewById(R.id.tv_detail_rank) tvSynopsis.text = anime.synopsis.toString() tvRank.text = anime.rank.toString() } fun showError(text: String) { Toast.makeText(this, text, Toast.LENGTH_LONG).show() } private fun fieldIsNull(): String { return "Unknown" } }