package db
import (
	"context"
)
type ListProjectConditionParam struct {
	TimeBegin string
	TimeEnd   string
	IsTitle   bool
	Title     string
	Status    int16
	PageID    int32
	PageSize  int32
}
type ProjectView struct {
	Project
	// 字符串ID
	SID          string `json:"sid"`
	CustomerName string `json:"customer_name"`
	ApplyName    string `json:"apply_name"`
	CreatedName  string `json:"created_name"`
	UpdatedName  string `json:"updated_name"`
	StatusName   string `json:"status_name"`
	ManagerName  string `json:"manager_name"`
	MemberNames  string `json:"member_names"`
}
func (store *SQLStore) ListProjectCondition(ctx context.Context, arg *ListProjectConditionParam) ([]*ProjectView, int64, error) {
	query, args, err := BuildQuery(`
	SELECT COUNT(1)
	FROM projects
	WHERE created_at BETWEEN @start AND @end
	{{if ne .status 9999}}AND status = @status{{end}}
	{{if .isTitle}}AND name LIKE @title{{end}};
	`, map[string]any{
		"start":   arg.TimeBegin,
		"end":     arg.TimeEnd,
		"status":  arg.Status,
		"isTitle": arg.IsTitle,
		"title":   arg.Title,
	})
	if err != nil {
		return nil, 0, err
	}
	var total int64
	if err := store.db.QueryRow(ctx, query, args...).Scan(&total); err != nil {
		return nil, 0, err
	}
	if total <= 0 {
		return nil, 0, nil
	}
	query, args, err = BuildQuery(`
	SELECT id, name, start_at, end_at, customer_id, total_money, description, apply_at, 
    COALESCE((SELECT name FROM customers WHERE id = projects.customer_id), '') as customer_name,
	COALESCE((SELECT username FROM sys_user WHERE id = projects.apply_user_id), '') as apply_name,
	status, sort, created_at, updated_at,
	created_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.created_user_id), '') as created_name,
	updated_user_id, COALESCE((SELECT username FROM sys_user WHERE id = projects.updated_user_id), '') as updated_name,
	(CASE
        WHEN status=-1 THEN '已删除'
        WHEN status=0 THEN '未开始'
        WHEN status=10 THEN '进行中'
        WHEN status=20 THEN '已结项'
    ELSE '未知'
           END) as status_name,
	COALESCE((SELECT username FROM sys_user WHERE id = projects.manager_id), '') as manager_name,
	COALESCE((SELECT string_agg(username, ',') FROM sys_user WHERE id::text = ANY (string_to_array(projects.members, ','))), '') as member_names
	FROM projects
	WHERE created_at BETWEEN @start AND @end
	{{if ne .status 9999}}AND status = @status{{end}}
	{{if .isTitle}}AND name LIKE @title{{end}}
	ORDER BY id DESC
	LIMIT @limit OFFSET @offset;
	`, map[string]any{
		"start":   arg.TimeBegin,
		"end":     arg.TimeEnd,
		"status":  arg.Status,
		"isTitle": arg.IsTitle,
		"title":   arg.Title,
		"limit":   arg.PageSize,
		"offset":  (arg.PageID - 1) * arg.PageSize,
	})
	if err != nil {
		return nil, 0, err
	}
	rows, err := store.db.Query(ctx, query, args...)
	if err != nil {
		return nil, 0, err
	}
	defer rows.Close()
	items := []*ProjectView{}
	for rows.Next() {
		var i ProjectView
		if err := rows.Scan(
			&i.SID,
			&i.Name,
			&i.StartAt,
			&i.EndAt,
			&i.CustomerID,
			&i.TotalMoney,
			&i.Description,
			&i.ApplyAt,
			&i.CustomerName,
			&i.ApplyName,
			&i.Status,
			&i.Sort,
			&i.CreatedAt,
			&i.UpdatedAt,
			&i.CreatedUserID,
			&i.CreatedName,
			&i.UpdatedUserID,
			&i.UpdatedName,
			&i.StatusName,
			&i.ManagerName,
			&i.MemberNames,
		); err != nil {
			return nil, 0, err
		}
		items = append(items, &i)
	}
	if err := rows.Err(); err != nil {
		return nil, 0, err
	}
	return items, total, nil
}