package com.miya.fastcashier.net

import android.util.Log
import com.miya.fastcashier.BaseApplication
import com.miya.fastcashier.beans.SelfCashierAccountInfo
import com.miya.fastcashier.beans.LoginRequest;
import com.miya.fastcashier.utils.LogFileUtils
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager


class ApiRequest private constructor() {

    companion object {

        private var apiService: ApiService? = null
        private var sInstance: ApiRequest? = null

        @Synchronized
        fun getInstance(): ApiRequest {
            if (null == sInstance) {
                sInstance = ApiRequest()
            }
            return sInstance!!
        }

        private fun getApiService(): ApiService {
            if (null == apiService) {
                val httpLoggingInterceptor =
                    MiyaHttpLoggingInterceptor {
                        Log.e("####", it)
                        if (!LogFileUtils.isProhibitWrite) {
                            LogFileUtils.writeLog(BaseApplication.getApplication(),it)
                        }
                    }.apply { level = MiyaHttpLoggingInterceptor.Level.BODY }


                val socketFactory = arrayOfNulls<SSLSocketFactory>(1)
                val trustManager = arrayOfNulls<X509TrustManager>(1)
                SSLCertificatesInit.init(socketFactory, trustManager)

                val client = OkHttpClient.Builder()
                    .addInterceptor(httpLoggingInterceptor)
                    .addInterceptor(RequestSignInterceptor())
                    .sslSocketFactory(socketFactory[0]!!, trustManager[0]!!)
                    .build()

                val retrofit = Retrofit.Builder()
                    .baseUrl(ApiConfig.baseUrl)
                    .client(client)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

                apiService = retrofit.create(ApiService::class.java)
            }

            return apiService!!
        }
    }

    fun login(
        loginRequest: LoginRequest,
        commonCallback: CommonCallback<SelfCashierAccountInfo>
    ) {
        getApiService().login(loginRequest).enqueue(commonCallback)
    }

    fun uploadFile(
        url: String,
        part: MultipartBody.Part,
        commonCallback: CommonCallback<String>
    ) {
        getApiService().uploadFile(url, part).enqueue(commonCallback)
    }
}