package repository

import (
	"database/sql"
	"errors"
	"fmt"
	"gin-vue-admin/models"
)

func QueryCaseHistoryAndMoney(db *sql.DB, t string) (interface{}, error) {

	var formatSQL string

	if len(t) == 10 {
		formatSQL = "%Y-%m-%d"
	} else if len(t) == 7 {
		formatSQL = "%Y-%m"
	} else if len(t) == 4 {
		formatSQL = "%Y"
	} else {
		return nil, errors.New("time error")
	}

	var res models.CaseHistoryAnalysis

	err := db.QueryRow(`select count(t.abstract) as counts, ifnull(sum(t.money), 0) from (
select cli.abstract as abstract, 
(select ifnull(convert(sum(c.quantity*c.payprice) / 1000000, decimal(11,3)), 0)
from his_consumption as c
left join his_bill as b on b.id = c.his_bill_id
where c.delflag = 0 
and c.his_retreatbill_id = 0 
and c.commodity_ismeal = 0
and c.meter_num = 0
and c.his_bill_id != 0 
and c.bussinesstype in (41,42,43,44,45,61,62,63,64,65)
and b.billtype in (1,4,6,7)
and c.parent_id = cli.id
) as money
from his_clinic as cli
where cli.delflag = 0 
and DATE_FORMAT(cli.eventtime, ?) = ? 
) as t`, formatSQL, t).Scan(&res.Count, &res.Money)

	if err != nil {
		return nil, err
	}

	return res, nil
}

func QuerySpeciesAndAgeByKindRepository(db *sql.DB, t string, _type int) (interface{}, error) {

	var formatSQL string

	if len(t) == 10 {
		formatSQL = "%Y-%m-%d"
	} else if len(t) == 7 {
		formatSQL = "%Y-%m"
	} else if len(t) == 4 {
		formatSQL = "%Y"
	} else {
		return nil, errors.New("time error")
	}

	// 计算病历中猫的数量 (驱虫后的)
	rows, err := db.Query(`select t.species, count(pet_id) from (
select p.species as species, c.his_pet_id as pet_id from his_clinic as c
left join his_pet as p on p.id = c.his_pet_id
where c.delflag = 0 and DATE_FORMAT(c.eventtime, ?) = ? and p.con_kind_id = ?
GROUP BY c.his_pet_id
) as t
GROUP BY t.species
limit 6`, formatSQL, t, _type)
	if err != nil {
		return nil, err
	}

	var response models.Kind
	kindDetail := make([]models.KindDetail, 0)
	ageDetail := make([]models.KindDetail, 5)

	for rows.Next() {
		var temp models.KindDetail
		err = rows.Scan(&temp.Type, &temp.Cost)
		if err != nil {
			return nil, err
		}
		temp.A = "1"
		response.Count += temp.Cost
		kindDetail = append(kindDetail, temp)

	}

	// 计算病历中所有宠物的数量
	var sumPetNumber int
	err = db.QueryRow(`select count(t.counts) from (
select count(c.id) as counts from his_clinic as c
where c.delflag = 0 and DATE_FORMAT(c.eventtime, ?) = ? 
GROUP BY c.his_pet_id
) as t`, formatSQL, t).Scan(&sumPetNumber)
	if err != nil {
		return nil, err
	}

	// 计算当前品种 所占百分比
	if sumPetNumber != 0 {
		response.Proportion = fmt.Sprintf("%.2f", float64(response.Count)/float64(sumPetNumber)*100)
	} else {
		response.Proportion = "0%"
	}

	// 获取年龄分布
	rows, err = db.Query(`select TIMESTAMPDIFF(YEAR, p.birthday, CURDATE()) 
from his_clinic as c
left join his_pet as p on p.id = c.his_pet_id
where c.delflag = 0 
and DATE_FORMAT(c.eventtime, ?) = ? 
and p.con_kind_id = ?
and p.birthday != '0000-00-00 00:00:00' 
GROUP BY c.his_pet_id`, formatSQL, t, _type)
	if err != nil {
		return nil, err
	}

	ages := make([]int, 5)
	for rows.Next() {
		var temp int
		err = rows.Scan(&temp)
		if err != nil {
			return nil, err
		}
		switch {
		case temp < 1:
			ages[0]++
		case temp >= 1 && temp < 3:
			ages[1]++
		case temp >= 3 && temp < 5:
			ages[2]++
		case temp >= 5 && temp < 8:
			ages[3]++
		case temp > 8:
			ages[4]++
		}
	}

	for k, v := range ages {
		switch k {
		case 0:
			ageDetail[k].Type = "1岁以下"
			ageDetail[k].Cost = v
			ageDetail[k].A = "1"
		case 1:
			ageDetail[k].Type = "1-3岁"
			ageDetail[k].Cost = v
			ageDetail[k].A = "1"
		case 2:
			ageDetail[k].Type = "3-5岁"
			ageDetail[k].Cost = v
			ageDetail[k].A = "1"
		case 3:
			ageDetail[k].Type = "5-8岁"
			ageDetail[k].Cost = v
			ageDetail[k].A = "1"
		case 4:
			ageDetail[k].Type = "8岁以上"
			ageDetail[k].Cost = v
			ageDetail[k].A = "1"
		}
	}

	resultAgeDetail := make([]models.KindDetail, 0)

	for _, v := range ageDetail {
		if v.Cost != 0 {
			resultAgeDetail = append(resultAgeDetail, v)
		}
	}

	response.KindDetails = kindDetail
	response.AgeDetails = resultAgeDetail

	return response, nil
}

func DiseaseAndOperationRankRepository(db *sql.DB, t string, _type int) (interface{}, error) {

	var formatSQL string

	if len(t) == 10 {
		formatSQL = "%Y-%m-%d"
	} else if len(t) == 7 {
		formatSQL = "%Y-%m"
	} else if len(t) == 4 {
		formatSQL = "%Y"
	} else {
		return nil, errors.New("time error")
	}

	sqlStr := ""
	if _type == 1 {
		sqlStr = `select t.abstract, count(t.abstract) as counts, ifnull(sum(t.money), 0) from (
select c.abstract as abstract, 
(select ifnull(convert(sum(co.quantity*co.payprice) / 1000000, decimal(11,3)), 0)
from his_consumption as co
left join his_bill as b on b.id = co.his_bill_id
where co.delflag = 0 
and co.his_retreatbill_id = 0 
and co.commodity_ismeal = 0
and co.meter_num = 0
and co.his_bill_id != 0 
and co.bussinesstype in (41,42,43,44,45,61,62,63,64,65)
and b.billtype in (1,4,6,7)
and co.parent_id = c.id) as money
from his_clinic as c
where c.delflag = 0 
and c.abstract != ''
and DATE_FORMAT(c.eventtime, ?) = ? 
) as t
GROUP BY t.abstract
ORDER BY counts desc
limit 8`
	} else {
		sqlStr = `select commodity_name, ifnull(convert(sum(quantity) / 1000, decimal(11,0)), 0) as counts, 
ifnull(convert(sum(quantity*payprice) / 1000000, decimal(11,3)), 0)
from his_consumption
where delflag = 0 
and his_retreatbill_id = 0 
and commodity_ismeal = 0
and meter_num = 0
and his_bill_id != 0  
and bussinesstype in (44, 64)
and DATE_FORMAT(eventtime, ?) = ?
GROUP BY commodity_name
ORDER BY counts desc
limit 8`
	}

	rows, err := db.Query(sqlStr, formatSQL, t)
	if err != nil {
		return nil, err
	}

	response := make([]models.ClinicTop, 0)
	for rows.Next() {
		var temp models.ClinicTop
		err = rows.Scan(&temp.Name, &temp.Num, &temp.Amount)
		if err != nil {
			return nil, err
		}
		response = append(response, temp)
	}

	return response, nil
}