// Pipe - A small and beautiful blogging platform written in golang.
// Copyright (C) 2017-2018, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

package service

import (
	"fmt"

	"github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql" // mysql
)

var readDb *gorm.DB
var writeDb *gorm.DB
var readUserDb *gorm.DB
var writeUserDb *gorm.DB

var readMiddleDb *gorm.DB
var writeMiddleDb *gorm.DB

var readPatientDb *gorm.DB
var writePatientDb *gorm.DB

var readSgjPatientDb *gorm.DB
var writeSgjPatientDb *gorm.DB

var readUserDbT *gorm.DB
var writeUserDbT *gorm.DB

var err error

func ConnectDB() {
	readHost := beego.AppConfig.String("readmysqlhost")
	readPort := beego.AppConfig.String("readmysqlport")
	readUser := beego.AppConfig.String("readmysqluser")
	readPass := beego.AppConfig.String("readmysqlpass")
	readName := beego.AppConfig.String("readmysqlname")

	writeHost := beego.AppConfig.String("writemysqlhost")
	writePort := beego.AppConfig.String("writemysqlport")
	writeUser := beego.AppConfig.String("writemysqluser")
	writePass := beego.AppConfig.String("writemysqlpass")
	writeName := beego.AppConfig.String("writemysqlname")

	readUserHost := beego.AppConfig.String("readuserhost")
	readUserPort := beego.AppConfig.String("readuserport")
	readUserUser := beego.AppConfig.String("readuseruser")
	readUserPass := beego.AppConfig.String("readuserpass")
	readUserName := beego.AppConfig.String("readusername")

	writeUserHost := beego.AppConfig.String("writeuserhost")
	writeUserPort := beego.AppConfig.String("writeuserport")
	writeUserUser := beego.AppConfig.String("writeuseruser")
	writeUserPass := beego.AppConfig.String("writeuserpass")
	writeUserName := beego.AppConfig.String("writeusername")

	readMiddleHost := beego.AppConfig.String("readmiddlehost")
	readMiddlePort := beego.AppConfig.String("readmiddleport")
	readMiddleUser := beego.AppConfig.String("readmiddleuser")
	readMiddlePass := beego.AppConfig.String("readmiddlepass")
	readMiddleName := beego.AppConfig.String("readmiddlename")

	writeMiddleHost := beego.AppConfig.String("writemiddlehost")
	writeMiddlePort := beego.AppConfig.String("writemiddleport")
	writeMiddleUser := beego.AppConfig.String("writemiddleuser")
	writeMiddlePass := beego.AppConfig.String("writemiddlepass")
	writeMiddleName := beego.AppConfig.String("writemiddlename")

	readPatientHost := beego.AppConfig.String("readpatienthost")
	readPatientPort := beego.AppConfig.String("readpatientport")
	readPatientUser := beego.AppConfig.String("readpatientuser")
	readPatientPass := beego.AppConfig.String("readpatientpass")
	readPatientName := beego.AppConfig.String("readpatientname")

	writePatientHost := beego.AppConfig.String("writepatienthost")
	writePatientPort := beego.AppConfig.String("writepatientport")
	writePatientUser := beego.AppConfig.String("writepatientuser")
	writePatientPass := beego.AppConfig.String("writepatientpass")
	writePatientName := beego.AppConfig.String("writepatientname")

	readSgjPatientHost := beego.AppConfig.String("readsgjpatientmysqlhost")
	readSgjPatientPort := beego.AppConfig.String("readsgjpatientmysqlport")
	readSgjPatientUser := beego.AppConfig.String("readsgjpatientmysqluser")
	readSgjPatientPass := beego.AppConfig.String("readsgjpatientmysqlpass")
	readSgjPatientName := beego.AppConfig.String("readsgjpatientmysqlname")

	writeSgjPatientHost := beego.AppConfig.String("writesgjpatientmysqlhost")
	writeSgjPatientPort := beego.AppConfig.String("writesgjpatientmysqlport")
	writeSgjPatientUser := beego.AppConfig.String("writesgjpatientmysqluser")
	writeSgjPatientPass := beego.AppConfig.String("writesgjpatientmysqlpass")
	writeSgjPatientName := beego.AppConfig.String("writesgjpatientmysqlname")

	readUserHostT := beego.AppConfig.String("readuserhostTest")
	readUserPortT := beego.AppConfig.String("readuserportTest")
	readUserUserT := beego.AppConfig.String("readuseruserTest")
	readUserPassT := beego.AppConfig.String("readuserpassTest")
	readUserNameT := beego.AppConfig.String("readusernameTest")

	writeUserHostT := beego.AppConfig.String("writeuserhostTest")
	writeUserPortT := beego.AppConfig.String("writeuserportTest")
	writeUserUserT := beego.AppConfig.String("writeuseruserTest")
	writeUserPassT := beego.AppConfig.String("writeuserpassTest")
	writeUserNameT := beego.AppConfig.String("writeusernameTest")

	rdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readUser, readPass, readHost, readPort, readName)
	wdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writeUser, writePass, writeHost, writePort, writeName)

	rudsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readUserUser, readUserPass, readUserHost, readUserPort, readUserName)
	wudsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writeUserUser, writeUserPass, writeUserHost, writeUserPort, writeUserName)

	rmdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readMiddleUser, readMiddlePass, readMiddleHost, readMiddlePort, readMiddleName)
	wmdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writeMiddleUser, writeMiddlePass, writeMiddleHost, writeMiddlePort, writeMiddleName)

	rpdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readPatientUser, readPatientPass, readPatientHost, readPatientPort, readPatientName)
	wpdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writePatientUser, writePatientPass, writePatientHost, writePatientPort, writePatientName)

	rspdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readSgjPatientUser, readSgjPatientPass, readSgjPatientHost, readSgjPatientPort, readSgjPatientName)
	wspdsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writeSgjPatientUser, writeSgjPatientPass, writeSgjPatientHost, writeSgjPatientPort, writeSgjPatientName)

	rudsnT := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", readUserUserT, readUserPassT, readUserHostT, readUserPortT, readUserNameT)
	wudsnT := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=true", writeUserUserT, writeUserPassT, writeUserHostT, writeUserPortT, writeUserNameT)

	readDb, err = gorm.Open("mysql", rdsn)
	if err != nil {
		//beego.Error(err)
	}
	readDb.DB().SetMaxIdleConns(10)
	readDb.DB().SetMaxOpenConns(100)
	readDb.LogMode(true)

	writeDb, err = gorm.Open("mysql", wdsn)
	if err != nil {
		//beego.Error(err)
	}
	writeDb.DB().SetMaxIdleConns(10)
	writeDb.DB().SetMaxOpenConns(100)
	writeDb.LogMode(true)

	readUserDbT, err = gorm.Open("mysql", rudsnT)
	if err != nil {
		//beego.Error(err)
	}
	readUserDbT.DB().SetMaxIdleConns(10)
	readUserDbT.DB().SetMaxOpenConns(100)
	readUserDbT.LogMode(true)

	writeUserDbT, err = gorm.Open("mysql", wudsnT)
	if err != nil {
		//beego.Error(err)
	}
	writeUserDbT.DB().SetMaxIdleConns(10)
	writeUserDbT.DB().SetMaxOpenConns(100)
	writeUserDbT.LogMode(true)

	readUserDb, err = gorm.Open("mysql", rudsn)
	if err != nil {
		//beego.Error(err)
	}
	readUserDb.DB().SetMaxIdleConns(10)
	readUserDb.DB().SetMaxOpenConns(100)
	readUserDb.LogMode(true)

	writeUserDb, err = gorm.Open("mysql", wudsn)
	if err != nil {
		//beego.Error(err)
	}
	writeUserDb.DB().SetMaxIdleConns(10)
	writeUserDb.DB().SetMaxOpenConns(100)
	writeUserDb.LogMode(true)

	readMiddleDb, err = gorm.Open("mysql", rmdsn)
	if err != nil {
		//beego.Error(err)
	}
	readMiddleDb.DB().SetMaxIdleConns(10)
	readMiddleDb.DB().SetMaxOpenConns(100)
	readMiddleDb.LogMode(true)

	writeMiddleDb, err = gorm.Open("mysql", wmdsn)
	if err != nil {
		//beego.Error(err)
	}
	writeMiddleDb.DB().SetMaxIdleConns(10)
	writeMiddleDb.DB().SetMaxOpenConns(100)
	writeMiddleDb.LogMode(true)

	readPatientDb, err = gorm.Open("mysql", rpdsn)
	if err != nil {
		beego.Error(err)
	}
	readPatientDb.DB().SetMaxIdleConns(10)
	readPatientDb.DB().SetMaxOpenConns(100)
	readPatientDb.LogMode(true)

	writePatientDb, err = gorm.Open("mysql", wpdsn)
	if err != nil {
		beego.Error(err)
	}
	writePatientDb.DB().SetMaxIdleConns(10)
	writePatientDb.DB().SetMaxOpenConns(100)
	writePatientDb.LogMode(true)

	readSgjPatientDb, err = gorm.Open("mysql", rspdsn)
	if err != nil {
		beego.Error(err)
	}
	readSgjPatientDb.DB().SetMaxIdleConns(10)
	readSgjPatientDb.DB().SetMaxOpenConns(100)
	readSgjPatientDb.LogMode(true)

	writeSgjPatientDb, err = gorm.Open("mysql", wspdsn)
	if err != nil {
		beego.Error(err)
	}
	writeSgjPatientDb.DB().SetMaxIdleConns(10)
	writeSgjPatientDb.DB().SetMaxOpenConns(100)
	writeSgjPatientDb.LogMode(true)
}

//func DisconnectDB() {
//	if err := readDb.Close(); nil != err {
//		beego.Error("Disconnect from database failed: " + err.Error())
//	}
//}

func XTReadDB() *gorm.DB {
	return readDb
}
func XTWriteDB() *gorm.DB {
	return writeDb
}
func UserReadDB() *gorm.DB {
	return readUserDb
}
func UserWriteDB() *gorm.DB {
	return writeUserDb
}

func MiddleReadDB() *gorm.DB {
	return readMiddleDb
}
func MiddleWriteDB() *gorm.DB {
	return writeMiddleDb
}

func PatientReadDB() *gorm.DB {
	return readPatientDb
}

func PatientWriteDB() *gorm.DB {
	return writePatientDb
}

func SgjPatientReadDB() *gorm.DB {
	return readSgjPatientDb
}

func SgjPatientWriteDB() *gorm.DB {
	return writeSgjPatientDb
}