Eu acho que para a ordem por parte você deve usar algo como
order by case
when stock > 0 then 0
when stock < 0 then 1
end ascending,
price ascending
Eu não verifiquei a sintaxe, mas essa é a ideia. Você pode google case em ordem para mais informações.
Quanto aos demais requisitos, eu precisaria da estrutura da tabela para entender melhor ...