package models

import (
	"eta/eta_api/models/ai_summary"
	"eta/eta_api/models/aimod"
	"eta/eta_api/models/company"
	"eta/eta_api/models/data_manage"
	"eta/eta_api/models/data_manage/chart_theme"
	"eta/eta_api/models/data_manage/cross_variety"
	"eta/eta_api/models/data_manage/data_manage_permission"
	"eta/eta_api/models/data_manage/edb_refresh"
	"eta/eta_api/models/data_manage/excel"
	future_good2 "eta/eta_api/models/data_manage/future_good"
	"eta/eta_api/models/data_manage/supply_analysis"
	"eta/eta_api/models/data_stat"
	"eta/eta_api/models/eta_trial"
	"eta/eta_api/models/fe_calendar"
	"eta/eta_api/models/ppt_english"
	"eta/eta_api/models/report"
	"eta/eta_api/models/report_approve"
	"eta/eta_api/models/sandbox"
	"eta/eta_api/models/semantic_analysis"
	"eta/eta_api/models/smart_report"
	"eta/eta_api/models/speech_recognition"
	"eta/eta_api/models/system"
	"eta/eta_api/models/yb"
	"eta/eta_api/utils"
	"time"

	_ "github.com/go-sql-driver/mysql"

	"github.com/beego/beego/v2/client/orm"
)

func init() {

	_ = orm.RegisterDataBase("default", "mysql", utils.MYSQL_URL)
	orm.SetMaxIdleConns("default", 50)
	orm.SetMaxOpenConns("default", 100)

	db, _ := orm.GetDB("default")
	db.SetConnMaxLifetime(10 * time.Minute)

	_ = orm.RegisterDataBase("rddp", "mysql", utils.MYSQL_URL_RDDP)
	orm.SetMaxIdleConns("rddp", 50)
	orm.SetMaxOpenConns("rddp", 100)

	report_db, _ := orm.GetDB("rddp")
	report_db.SetConnMaxLifetime(10 * time.Minute)

	_ = orm.RegisterDataBase("edb", "mysql", utils.MYSQL_URL_EDB)
	orm.SetMaxIdleConns("edb", 50)
	orm.SetMaxOpenConns("edb", 100)

	edb_db, _ := orm.GetDB("edb")
	edb_db.SetConnMaxLifetime(10 * time.Minute)

	_ = orm.RegisterDataBase("data", "mysql", utils.MYSQL_URL_DATA)
	orm.SetMaxIdleConns("data", 50)
	orm.SetMaxOpenConns("data", 100)

	data_db, _ := orm.GetDB("data")
	data_db.SetConnMaxLifetime(10 * time.Minute)

	_ = orm.RegisterDataBase("gl", "mysql", utils.MYSQL_URL_GL)
	orm.SetMaxIdleConns("gl", 50)
	orm.SetMaxOpenConns("gl", 100)

	gl, _ := orm.GetDB("gl")
	gl.SetConnMaxLifetime(10 * time.Minute)

	// 用户主库
	if utils.MYSQL_WEEKLY_URL != `` && (utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox || utils.BusinessCode == utils.BusinessCodeDebug) {
		_ = orm.RegisterDataBase("weekly", "mysql", utils.MYSQL_WEEKLY_URL)
		orm.SetMaxIdleConns("weekly", 50)
		orm.SetMaxOpenConns("weekly", 100)

		weeklyDb, _ := orm.GetDB("weekly")
		weeklyDb.SetConnMaxLifetime(10 * time.Minute)
	}

	if utils.MYSQL_AI_URL != "" {
		_ = orm.RegisterDataBase("ai", "mysql", utils.MYSQL_AI_URL)
		orm.SetMaxIdleConns("ai", 50)
		orm.SetMaxOpenConns("ai", 100)

		weeklyDb, _ := orm.GetDB("ai")
		weeklyDb.SetConnMaxLifetime(10 * time.Minute)
	}

	orm.Debug = true
	orm.DebugLog = orm.NewLog(utils.Binlog)

	//注册对象
	orm.RegisterModel(
		new(Classify),
		new(Resource),
		new(PptV2),
		new(PptV2PublishRecord),
		new(PptV2SaveLog),
		new(PptV2Group),
		new(PptV2GroupMapping),
		new(PptV2Grant),                 //ppt授权操作表
		new(VarietyClassify),            // 标签分类表
		new(VarietyTag),                 // 标签表
		new(ResearchVarietyTagRelation), // 研究员标签关系表
		new(ReportPptImg),               //Ppt转报告的图片记录表
	)

	// 系统表 数据表
	initSystem()

	// 客户相关
	initCompany()

	// 联系人相关
	initWxUser()

	// 报告相关 数据表
	initReport()

	// 研报相关
	initYb()

	// 注册Edb沙盘 数据表
	initSandbox()

	// 上海指标服务 数据表
	initShEdbData()

	// 指标服务 数据表
	initEdbData()

	// 图表 数据表
	initChart()
	// 英文报告
	initEnglishReport()

	// 英文ppt
	initPptEnglish()

	// 期货数据库
	initFutureGood()

	// 共享网盘
	initCloudDisk()

	// 语义分析
	initSemanticAnalysis()

	// 供应分析
	initSupplyAnalysis()

	//多图配置
	initMultipleGraphConfig()

	// 商家配置
	initBusinessConf()

	// 图库框架
	initChartFramework()

	// 外部链接
	initOutLink()

	// 智能研报
	initSmartReport()

	// ETA试用相关表
	if utils.BusinessCode == utils.BusinessCodeSandbox {
		initEtaTrial()
	}

	// initDataStat 数据源统计管理相关表
	initDataStat()

	// 初始化EXCEL的表
	initExcel()

	// 初始化跨品种分析表
	initCrossVariety()

	//初始化AI
	initAi()

	// 报告审批
	initReportApprove()

	// 初始化图表主题
	initChartTheme()

	// 初始化指标刷新
	initEdbRefresh()

	// 语音识别
	initSpeechRecognition()

	// 初始化数据资产权限的一些表
	initDataMangePerMission()

	// 初始化外汇日历
	initFeCalendar()

	// 初始化因子指标系列
	initFactorEdbSeries()

	// 初始化部分数据表变量(直接init会有顺序问题=_=!)
	afterInitTable()
}

// initSystem 系统表 数据表
func initSystem() {
	orm.RegisterModel(
		new(system.SysUserLoginRecord),
		new(system.SysSession),
		new(system.SysDepartment),
		new(system.SysGroup),
		new(system.SysRoleMenu),
		new(system.Admin),
		new(system.SysRole),
		new(system.SysMenuButton),
		new(system.SysRoleButton),
		new(system.ResearchGroup),         // 研究员研究方向分组表
		new(system.ResearchGroupRelation), // 研究员研究方向分组关系表
		new(system.SysRoleAdmin),          //管理员账号和角色映射表
		new(system.AdminConfig),           //系统用户配置表
		new(system.AdminOperateRecord),
		new(system.AdminVerifyCodeRecord), // 用户短信邮箱验证码记录表
	)
}

// initCompany 客户相关 数据表
func initCompany() {
	orm.RegisterModel(
		new(company.Company),
	)
}

// initWxUser 联系人相关 数据表
func initWxUser() {
	orm.RegisterModel(
		new(WxUser),
		new(UserSellerRelation),
	)
}

// initReport 报告相关 数据表
func initReport() {
	orm.RegisterModel(
		new(Report),
		new(ReportViewRecord),
		new(ChartPermissionSearchKeyWordMapping), //报告分类权限表
		new(ReportChapter),                       // 报告章节表
		new(ReportChapterTicker),                 // 晨报章节ticker
		new(ReportChapterTypePermission),         // 晨周报章节类型权限表
		new(ChartPermission),                     // 权限表
		new(YbPcSuncode),
		new(YbSuncodePars),
		new(ReportAuthor),                          //报告作者
		new(ClassifyMenu),                          // 报告分类-子目录表
		new(ClassifyMenuRelation),                  // 报告分类-子目录关联表
		new(ChartPermissionChapterMapping),         // 权限mapping表
		new(ReportChapterType),                     // 报告章节类型表
		new(ReportStateRecord),                     // 研报状态修改记录表
		new(report.ReportGrant),                    // 报告授权用户表
		new(report.ReportChapterGrant),             // 报告章节授权用户表
		new(report.ReportChapterPermissionMapping), // 报告章节的权限关系表
	)
}

// initYb 研报 数据表
func initYb() {
	orm.RegisterModel(
		new(yb.PriceDriven),              // 价格驱动表
		new(yb.PriceDrivenSaveLog),       // 价格驱动保存记录表
		new(yb.PriceDrivenTag),           // 价格驱动标签表
		new(yb.CommunityQuestionProcess), // 研报问答社区流程表
	)
}

// initSandbox 注册Edb沙盘 数据表
func initSandbox() {
	//注册对象
	orm.RegisterModel(
		new(sandbox.Sandbox),         //沙盘主表
		new(sandbox.SandboxVersion),  //沙盘版本表
		new(sandbox.SandboxDraft),    //沙盘草稿表
		new(sandbox.SandboxClassify), //沙盘分类表
	)
}

// initShEdbData 上海服务器指标 数据表
func initShEdbData() {
	orm.RegisterModel(
		new(Edbdata),
		new(EdbdataDeleteRecord),
		new(EdbdataImportFail),
		new(EdbImportFail),                   //指标导入失败数据表
		new(Edbinfo),                         //edb库的edbinfo表
		new(data_manage.ExcelStyle),          //在线excel样式表
		new(data_manage.ExcelEdbdataMapping), //excel样式和指标映射表
		new(EdbinfoOpRecord),                 // 手工数据的操作日志
	)
}

// initEdbData 指标服务 数据表
func initEdbData() {
	orm.RegisterModel(
		new(data_manage.EdbClassify),
		new(data_manage.EdbInfo), //hz_data库的edb_info表
		new(data_manage.EdbDataThs),
		new(data_manage.EdbDataWind),
		new(data_manage.EdbDataPb),
		new(data_manage.ManualUserClassify),
		new(data_manage.EdbdataClassify),
		new(data_manage.ManualUser),
		new(data_manage.EdbInfoCalculate),
		new(data_manage.SearchKeyword),
		new(data_manage.BaseFromSmm),
		new(data_manage.BaseFromSmmIndex),
		new(data_manage.BaseFromSmmData),
		new(data_manage.BaseFromSmmClassify),
		new(data_manage.EdbInfoLog),
		new(data_manage.EdbInfoRecord),
		new(data_manage.EdbInfoCalculateMapping),
		new(data_manage.PredictEdbConf),                  //预测指标配置
		new(data_manage.BaseFromMysteelChemicalClassify), //预测指标配置
		new(data_manage.BaseFromMysteelChemicalIndex),    //钢联化工
		new(data_manage.BaseFromEiaSteoClassify),         // Eia steo 报告指标
		new(data_manage.BaseFromEiaSteoIndex),            // Eia steo 报告指标分类
		new(data_manage.PredictEdbRuleData),              //预测指标,动态规则的计算数据
		new(data_manage.ComTradeCountry),                 //联合国商品贸易数据库的国家编码表
		new(data_manage.ComTradeData),                    //联合国商品贸易数据表
		new(data_manage.BaseFromSci),
		new(data_manage.BaseFromSciIndex),
		new(data_manage.BaseFromSciData),
		new(data_manage.BaseFromSciClassify),
		new(data_manage.TradePositionDalianTop),
		new(data_manage.TradePositionZhengzhouTop),
		new(data_manage.TradePositionCffexTop),
		new(data_manage.TradePositionShanghaiTop),
		new(data_manage.TradePositionIneTop),
		new(data_manage.BaseFromBaiinfo),
		new(data_manage.BaseFromBaiinfoIndex),
		new(data_manage.BaseFromBaiinfoData),
		new(data_manage.BaseFromBaiinfoClassify),
		new(data_manage.EdbDataInsertConfig),      // 指标数据插入配置表
		new(data_manage.EdbInfoNoPermissionAdmin), //指标不可见用户配置表
		new(data_manage.EdbTerminal),              //指标终端
		new(data_manage.BaseFromThsHfIndex),
		new(data_manage.BaseFromThsHfData),
		new(data_manage.BaseFromThsHfClassify),
		new(data_manage.BaseFromEdbMapping),
		new(data_manage.EdbInfoRelation), //指标关系表
		new(data_manage.BaseFromSciHqClassify),
		new(data_manage.BaseFromSciHqIndex),
		new(data_manage.BaseFromSciHqData),
	)
}

// initChart 图表 数据表
func initChart() {
	orm.RegisterModel(
		new(data_manage.ChartClassify),
		new(data_manage.ChartInfo),
		new(data_manage.ChartEdbMapping),
		new(data_manage.MyChartClassify),
		new(data_manage.MyChart),
		new(data_manage.MyChartLog),
		new(data_manage.MyChartClassifyMapping),
		new(data_manage.ChartInfoLog),
		new(data_manage.ChartInfoCorrelation),
		new(data_manage.ChartSeries),
		new(data_manage.ChartSeriesEdbMapping),
	)
}

// initEnglishReport 英文报告
func initEnglishReport() {
	orm.RegisterModel(
		new(EnglishReport),
		new(EnglishPolicyReport),
		new(EnglishReportEmail),
		new(EnglishReportEmailPV),
		new(EnglishReportEmailLog),
		new(EnglishClassify),
		new(EnglishCompany),           // 英文客户
		new(EnglishCompanyLog),        // 英文客户操作日志
		new(EnglishReportEmailOpLog),  // 英文联系人操作日志
		new(EnglishCompanyTodo),       // 英文客户TODO任务
		new(EnglishCompanyTodoPublic), // 英文客户公共TODO任务
		new(EnglishVideoCover),        // 英文研报线上路演视频封面
		new(EnglishVideo),             // 英文研报线上路演
		new(EnPermission),             // 英文品种权限表
		new(EnCompanyPermission),      // 英文客户品种权限关联表
		new(EnClassifyPermission),     // 英文分类品种权限关联表
	)
}

// initPptEnglish ppt英文
func initPptEnglish() {
	orm.RegisterModel(
		new(ppt_english.PptEnglish),
		new(ppt_english.PptEnglishPublishRecord),
		new(ppt_english.PptEnglishSaveLog),
		new(ppt_english.PptEnglishGroup),
		new(ppt_english.PptEnglishGroupMapping),
		new(ppt_english.PptEnglishGrant),     //ppt授权操作表
		new(ppt_english.ReportPptEnglishImg), //Ppt转报告的图片记录表
	)
}

// initFutureGood 注册期货数据 数据表
func initFutureGood() {
	//注册对象
	orm.RegisterModel(
		new(future_good2.FutureGoodEdbInfo), //期货指标表
		new(future_good2.FutureGoodEdbData), //期货指标数据表
		//new(future_good2.FutureGoodChartClassify), //期货指标分类表
		new(future_good2.ChartInfoFutureGoodProfit), //期货利润图的扩展表
	)
}

// initCloudDisk 共享云盘
func initCloudDisk() {
	//注册对象
	orm.RegisterModel(
		new(CloudDiskMenu),     // 云盘目录表
		new(CloudDiskResource), // 云盘资源表
	)
}

// initSemanticAnalysis 语义分析
func initSemanticAnalysis() {
	orm.RegisterModel(
		new(semantic_analysis.SaLabel),                // 语义分析-标签表
		new(semantic_analysis.SaDocClassify),          // 语义分析-文档分类表
		new(semantic_analysis.SaDoc),                  // 语义分析-文档表
		new(semantic_analysis.SaDocSection),           // 语义分析-文档段落表
		new(semantic_analysis.SaCompareClassify),      // 语义分析-比对分类表
		new(semantic_analysis.SaCompare),              // 语义分析-比对表
		new(semantic_analysis.SaCompareDoc),           // 语义分析-比对关联文档表
		new(semantic_analysis.SaCompareLabel),         // 语义分析-比对段落表
		new(semantic_analysis.SaCompareSearchKeyword), // 语义分析-比对搜索关键词
	)
}

// initSupplyAnalysis 供应分析
func initSupplyAnalysis() {
	orm.RegisterModel(
		new(supply_analysis.Variety),
		new(supply_analysis.VarietyAdminPermission),
		new(supply_analysis.VarietyEdbInfo),
		new(supply_analysis.VarietyPlant),
	)
}

// initMultipleGraphConfig 多图配置 数据表
func initMultipleGraphConfig() {
	//注册对象
	orm.RegisterModel(
		new(data_manage.MultipleGraphConfig),             //多图配置表
		new(data_manage.MultipleGraphConfigChartMapping), //图表与多图配置的关系表
		new(data_manage.MultipleGraphConfigEdbMapping),   //指标与多图配置的关系表
	)
}

// initBusinessConf 商家配置
func initBusinessConf() {
	orm.RegisterModel(
		new(BusinessConf),                // 商家配置表
		new(BusinessConfOperationRecord), // 商家配置操作记录表
	)
}

func initOutLink() {
	orm.RegisterModel(
		new(OutLink)) // 外部链接表
}

// initEtaTrial 试用平台相关表
func initEtaTrial() {
	orm.RegisterModel(
		new(eta_trial.QuestionnaireFillRecord), // 问卷填写记录表
	)
}

// initDataStat 数据源统计管理相关表
func initDataStat() {
	orm.RegisterModel(
		new(data_stat.EdbInfoDeleteLog),  // 指标删除日志表
		new(data_stat.EdbInfoUpdateStat), // 指标更新/刷新 汇总表(数据源明细表)
		new(data_stat.EdbInfoUpdateLog),  // 指标更新/刷新日志列表
		new(data_stat.EdbSourceStat),     // 数据源统计表
	)
}

// initChartFramework 图库框架相关表
func initChartFramework() {
	orm.RegisterModel(
		new(data_manage.ChartFramework),     // 图库框架主表
		new(data_manage.ChartFrameworkNode), // 图库框架节点表
	)
}

// initExcel 初始化EXCEL
func initExcel() {
	orm.RegisterModel(
		new(excel.ExcelClassify),        //ETA excel表格分类
		new(excel.ExcelInfo),            //ETA excel表格
		new(excel.ExcelDraft),           //ETA excel表格草稿
		new(excel.ExcelSheet),           //ETA excel sheet
		new(excel.ExcelSheetData),       //ETA excel sheet data
		new(excel.ExcelEdbMapping),      //ETA excel 与 指标 的关系表
		new(excel.ExcelWorker),          // 平衡表协作人表格
		new(excel.ExcelChartEdb),        // 平衡表做图指标
		new(excel.ExcelChartData),       // 平衡表作图数据
		new(excel.ExcelInfoRuleMapping), //表格的管理规则
	)
}

// initSmartReport 智能研报相关表
func initSmartReport() {
	orm.RegisterModel(
		new(smart_report.SmartReport),         // 智能研报主表
		new(smart_report.SmartReportSaveLog),  // 智能研报-保存记录表
		new(smart_report.SmartReportResource), // 智能研报-资源表
	)
}

// initCrossVariety 跨品种分析
func initCrossVariety() {
	orm.RegisterModel(
		new(cross_variety.ChartVariety),          // 品种表
		new(cross_variety.ChartTag),              // 标签表
		new(cross_variety.ChartTagVariety),       // 标签、品种、指标关系表
		new(cross_variety.ChartVarietyMapping),   // 图表与品种的关系表
		new(cross_variety.ChartInfoCrossVariety), // 跨品种分析配置表
	)
}

func initAi() {
	orm.RegisterModel(
		new(aimod.AiChatTopic),
		new(aimod.AiChat),
		new(aimod.FileUploadRecord),
		new(ai_summary.AiSummaryClassify),
		new(ai_summary.AiSummary),
		new(ai_summary.AiPrompt),
	)
}

// initReportApprove 报告审批相关表
func initReportApprove() {
	orm.RegisterModel(
		new(report_approve.ReportApprove),        // 审批表
		new(report_approve.ReportApproveFlow),    // 审批流表
		new(report_approve.ReportApproveNode),    // 审批节点表
		new(report_approve.ReportApproveRecord),  // 审批记录表
		new(report_approve.ReportApproveMessage), // 审批消息表
	)
}

// initChartTheme 初始化图表主题
func initChartTheme() {
	orm.RegisterModel(
		new(chart_theme.ChartTheme),            // 图表主题
		new(chart_theme.ChartThemeType),        // 图表主题类型
		new(chart_theme.ChartThemeDefaultData), //默认数据
	)
}

// initEdbRefresh 初始化指标刷新
func initEdbRefresh() {
	orm.RegisterModel(
		new(edb_refresh.EdbRefreshSource),        // 刷新的数据源表
		new(edb_refresh.EdbRefreshDefaultConfig), // 指标的默认刷新时间配置表
		new(edb_refresh.EdbRefreshConfig),        // 指标的刷新时间配置表
		new(edb_refresh.EdbRefreshMapping),       // 指标刷新时间配置关系表
	)
}

// initSpeechRecognition 语音识别
func initSpeechRecognition() {
	orm.RegisterModel(
		new(speech_recognition.SpeechRecognition),           // 语音识别表
		new(speech_recognition.SpeechRecognitionApiLog),     // 语音识别-API请求日志
		new(speech_recognition.SpeechRecognitionContent),    // 语音识别-转换内容表
		new(speech_recognition.SpeechRecognitionMenu),       // 语音识别-目录表
		new(speech_recognition.SpeechRecognitionTag),        // 语音识别-标签表
		new(speech_recognition.SpeechRecognitionTagMenu),    // 语音识别-标签目录表
		new(speech_recognition.SpeechRecognitionTagMapping), // 语音识别-标签关联表
	)
}

// initDataMangePerMission
// @Description: 初始化数据资产权限的一些表
// @author: Roc
// @datetime 2024-03-27 14:03:11
func initDataMangePerMission() {
	orm.RegisterModel(
		new(data_manage_permission.EdbInfoPermission),                       // 指标权限表
		new(data_manage_permission.EdbClassifyPermission),                   // 指标分类权限表
		new(data_manage_permission.ChartInfoPermission),                     // 图表权限表
		new(data_manage_permission.ChartClassifyPermission),                 // 图表分类权限表
		new(data_manage_permission.ExcelInfoPermission),                     // ETA表格权限表
		new(data_manage_permission.ExcelClassifyPermission),                 // ETA表格分类权限表
		new(data_manage_permission.DataPermissionMessage),                   // 数据权限变更消息表
		new(data_manage_permission.DataPermissionMoveRecord),                // 数据资产转移记录表
		new(data_manage_permission.EdbInfoPermissionNoAuthRecord),           // 指标资产数据未授权分类记录表
		new(data_manage_permission.ChartInfoPermissionNoAuthRecord),         // 图表资产数据未授权分类记录表
		new(data_manage_permission.ExcelInfoPermissionNoAuthRecord),         // ETA表格资产数据未授权分类记录表
		new(data_manage_permission.EdbInfoClassifyPermissionNoAuthRecord),   // 指标资产分类数据未授权分类记录表
		new(data_manage_permission.ChartInfoClassifyPermissionNoAuthRecord), // 图表资产分类数据未授权分类记录表
		new(data_manage_permission.ExcelInfoClassifyPermissionNoAuthRecord), // ETA表格资产分类数据未授权分类记录表
		new(data_manage_permission.DataPermissionClassifyNoAuthRecord),      // 资产分类数据权限未授权记录表
		new(data_manage_permission.DataPermissionNoAuthRecord),              // 资产数据权限设置记录表
	)
}

// initFeCalendar 初始化外汇日历
func initFeCalendar() {
	orm.RegisterModel(
		new(fe_calendar.FeCalendarMatter), // 事项表
	)
}

// initFactorEdbSeries 因子指标系列数据表
func initFactorEdbSeries() {
	orm.RegisterModel(
		new(data_manage.FactorEdbSeries),                  // 因子指标系列
		new(data_manage.FactorEdbSeriesChartMapping),      // 因子指标系列-图表关联
		new(data_manage.FactorEdbSeriesMapping),           // 因子指标系列-指标计算数据
		new(data_manage.FactorEdbSeriesCalculateData),     // 因子指标系列-指标关联
		new(data_manage.FactorEdbSeriesCalculateDataQjjs), // 因子指标系列-区间计算数据
	)
}

// afterInitTable
// @Description: 初始化表结构的的后置操作
// @author: Roc
// @datetime 2024-07-01 13:31:09
func afterInitTable() {
	// 初始化指标来源配置
	data_manage.InitEdbSourceVar()

	// 初始化是否启用mongo配置
	InitUseMongoConf()
}