package service

import (
	"XT_New/models"
	"fmt"
	"github.com/jinzhu/gorm"
	"strconv"
	"time"
)

func GetOrgTypes() (ots []*models.OrgType, err error) {
	err = readUserDb.Model(&models.OrgType{}).Where("status=1").Order("sort_no").Find(&ots).Error
	return
}

func UpdateOrgInfo(org *models.Org) (err error) {
	err = writeUserDb.Model(&models.Org{}).Where("id=?", org.Id).Update(org).Error
	return
}

func GetIllnessList() (ills []*models.Illness, err error) {
	err = readUserDb.Where("status=1").Find(&ills).Error
	return
}

func CreateOrgGalleryItem(item *models.OrgGallery) (err error) {
	err = writeUserDb.Create(item).Error
	return
}

func DeleteOrgGalleryItem(id int64) (err error) {
	err = writeUserDb.Model(&models.OrgGallery{}).Where("id=?", id).Update(map[string]interface{}{"Status": 0, "Mtime": time.Now().Unix()}).Error
	return
}

func CreateOrg(org *models.Org, name string, openXT bool, openCDM bool, openSCRM bool, openMall bool) error {
	now := time.Now()
	tx_admin := writeUserDb.Begin()
	if err := tx_admin.Create(org).Error; err != nil {
		tx_admin.Rollback()
		return err
	}
	role := models.Role{
		RoleName:     "超级管理员",
		RoleIntro:    "",
		Creator:      org.Creator,
		OrgId:        org.Id,
		AppId:        0,
		IsSuperAdmin: true,
		Status:       1,
		CreateTime:   now.Unix(),
		ModifyTime:   now.Unix(),
	}
	if err := tx_admin.Create(&role).Error; err != nil {
		tx_admin.Rollback()
		return err
	}

	// app 的创建顺序也决定了登录后前往 app 的优先级
	if err := createOrgApp(tx_admin, &role, name, 3, openXT); err != nil {
		tx_admin.Rollback()
		return err
	}

	nextMonthDate := now.AddDate(0, 0, 30)
	subscibe := models.ServeSubscibe{
		OrgId:       int64(org.Id),
		PeriodStart: now.Unix(),
		PeriodEnd:   nextMonthDate.Unix(),
		Status:      1,
		CreatedTime: now.Unix(),
		UpdatedTime: now.Unix(),
		State:       9,
	}
	if err := tx_admin.Create(&subscibe).Error; err != nil {
		tx_admin.Rollback()
		return err
	}

	tx_patient := writeSgjPatientDb.Begin()
	if err := tx_patient.Exec("INSERT INTO sgj_patient_articles_menu (name, status, type, user_org_id, ctime, mtime) VALUES(?, ?, ?, ?, ?, ?);", "科普教育", 1, 1, org.Id, now.Unix(), now.Unix()).Error; err != nil {
		tx_patient.Rollback()
		tx_admin.Rollback()
		return err
	}
	if err := tx_patient.Exec("INSERT INTO sgj_patient_good_category (user_org_id, category_name, status, created_time, updated_time) VALUES(?, ?, ?, ?, ?);", org.Id, "普通商品", 1, now.Unix(), now.Unix()).Error; err != nil {
		tx_patient.Rollback()
		tx_admin.Rollback()
		return err
	}

	if err := tx_admin.Exec("INSERT INTO sgj_user_membership_card (user_org_id, card_name, card_level, upgrade_integral, card_right, use_notice, background_type, background, service_phone, status, created_time, updated_time) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);", org.Id, "普通会员", 0, 0, "", "", 1, "#CACA41", "", 1, now.Unix(), now.Unix()).Error; err != nil {
		tx_admin.Rollback()
		tx_patient.Rollback()
		return err
	}

	tx_admin.Commit()
	tx_patient.Commit()
	return nil
}

func createOrgApp(tx *gorm.DB, superAdminRole *models.Role, userName string, appType int, open bool) error {

	//创建应用
	now := time.Now().Unix()
	var app_id int64
	apps, _ := FindSystemOrgApp()
	for _, item := range apps {
		app := &VMOrgApp{
			AppType:    item.AppType,
			Creator:    int(superAdminRole.Creator),
			OrgId:      int(superAdminRole.OrgId),
			OpenStatus: item.OpenStatus,
			Status:     1,
			CreateTime: now,
			ModifyTime: now,
			Name:       item.Name,
			Url:        item.Url,
			Number:     item.Number,
			Pid:        0,
		}
		writeUserDb.Create(&app)
		if app.AppType == 3 {
			app_id = app.ID

		}
		fmt.Println(item.VMOrgApp)

		for _, subItem := range item.VMOrgApp {
			app := &VMOrgApp{
				AppType:    subItem.AppType,
				Creator:    int(superAdminRole.Creator),
				OrgId:      int(superAdminRole.OrgId),
				OpenStatus: subItem.OpenStatus,
				Status:     1,
				CreateTime: now,
				ModifyTime: now,
				Name:       subItem.Name,
				Url:        subItem.Url,
				Number:     subItem.Number,
				Pid:        app.ID,
			}
			writeUserDb.Create(&app)
		}
	}

	//string := strconv.FormatInt(int64,10        /)
	app_role := models.App_Role{
		AdminUserId: superAdminRole.Creator,
		OrgId:       superAdminRole.OrgId,
		AppId:       app_id,
		RoleId:      superAdminRole.Id,
		RoleIds:     strconv.FormatInt(superAdminRole.Id, 10),
		Avatar:      "",
		UserName:    userName,
		Intro:       "",
		UserType:    1,
		UserTitle:   0,
		Status:      1,
		CreateTime:  now,
		ModifyTime:  now,
	}
	if createApp_RoleErr := tx.Create(&app_role).Error; createApp_RoleErr != nil {
		return createApp_RoleErr
	}
	return nil
}

func GetOrgTypeByName(org_type_name string) (org_type models.OrgType) {
	readUserDb.Model(&models.OrgType{}).Where("status = 1 AND name = ?", org_type_name).First(&org_type)
	return
}

type VMOrgApp struct {
	ID         int64       `gorm:"PRIMARY_KEY;AUTO_INCREMENT" json:"id"` // ID
	AppType    int         `gorm:"column:app_type" json:"app_type"`
	Creator    int         `json:"creator"` // 创建者,即管理员用户的 id
	OrgId      int         `gorm:"column:org_id" json:"org_id"`
	OpenStatus int         `gorm:"column:open_status" json:"open_status"`
	Status     int8        `json:"status"`                    // 状态 0.无效 1.有效 2.禁用
	CreateTime int64       `gorm:"column:ctime" json:"ctime"` // 创建时间
	ModifyTime int64       `gorm:"column:mtime" json:"mtime"` // 修改时间
	Name       string      `gorm:"column:name" json:"name" form:"name"`
	Url        string      `gorm:"column:url" json:"url" form:"url"`
	Pid        int64       `gorm:"column:pid" json:"pid" form:"pid"`
	Number     int64       `gorm:"column:number" json:"order" form:"number"`
	VMOrgApp   []*VMOrgApp `gorm:"ForeignKey:Pid;AssociationForeignKey:Id" `
}

func (VMOrgApp) TableName() string {
	return "sgj_user_org_app"
}

func FindSystemOrgApp() (app []*VMOrgApp, err error) {
	err = readUserDb.Model(&VMOrgApp{}).Preload("VMOrgApp", "org_id = 0 AND status =1 AND pid > 0").Where("status = 1 AND org_id = 0 AND pid = 0").Find(&app).Error
	return
}

func GetAllOrgByAdminUserId() {

}