Faits :
A.
Par jugement du 18 juillet 2014, le Tribunal correctionnel de l'arrondissement de Lausanne a reconnu X._ coupable d'abus de confiance, tentative d'abus de confiance, escroquerie, mise en circulation de fausse monnaie, importation, acquisition et prise en dépôt de fausse monnaie, faux dans les titres, dénonciation calomnieuse et corruption active, et l'a condamné à une peine privative de liberté ferme de 30 mois, sous déduction de 82 jours de détention avant jugement.
Statuant le 1er décembre 2014, la Cour d'appel pénale du Tribunal cantonal vaudois a rejeté l'appel de X._ et confirmé le jugement du tribunal correctionnel du 18 juillet 2014.
En bref, les faits retenus par la Cour d'appel sont les suivants. Le prévenu a été l'administrateur unique de la société A._ SA du 17 mars 2003 au 25 février 2008, date à laquelle B._ l'a reprise. Le prévenu a également été l'administrateur de la société C._ SA du 17 juin 2005 au 11 août 2008, date à laquelle il l'a transférée à B._. Ces deux sociétés n'ont jamais exercé d'activité. B._ a repris ces deux sociétés sur proposition du prévenu qui lui a expliqué que ces entités bénéficiaient de véhicules en crédit-bail qu'il ne pouvait pas vendre lui-même, puisqu'il était déjà connu de la justice; B._ a adhéré au projet. Ainsi, régulièrement, le prévenu a aidé B._ à vendre des véhicules et à utiliser ces sociétés comme paravents afin d'ouvrir des comptes auprès de diverses entreprises pour bénéficier de matériel à crédit, dans le dessein de revendre les biens ainsi acquis, sans s'acquitter des factures. Il a falsifié les documents nécessaires et B._ les a signés. Le prévenu a conservé l'argent obtenu par la vente des véhicules ou des marchandises non payées. Au total, il a obtenu entre 70'000 et 80'000 francs. Son comparse devait recevoir la moitié de ce montant, mais n'a obtenu que 5'000 à 6'000 francs.
B.
Agissant par la voie du recours en matière pénale au Tribunal fédéral, X._ conclut à son acquittement, subsidiairement à sa condamnation pour faux dans les titres et à son acquittement pour les autres chefs d'accusation, et plus subsidiairement à l'annulation du jugement du 1er décembre 2014 et au renvoi de la cause à la cour cantonale pour nouvelle décision dans le sens des considérants. Il requiert en outre l'octroi de l'assistance judiciaire et de l'effet suspensif.
Les 1er mai, 1er octobre et 11 novembre 2015, le recourant a adressé des courriers spontanés au Tribunal fédéral.
Invités à se déterminer, la cour cantonale et le ministère public ont renoncé à formuler des observations.
Considérant en droit :
1.
Aucun fait nouveau ni preuve nouvelle ne peut être présenté à moins de résulter de la décision de l'autorité précédente (art. 99 al. 1 LTF).
Le recourant a joint plusieurs pièces nouvelles à ses courriers des 1er mai, 1er octobre et 11 novembre 2015. Il s'agit d'une déclaration écrite de B._ datée du 14 avril 2015 et de cinq pièces relatives à la procédure PE14.012723 (avis de prochaine clôture du 16 mars 2015, courriers adressés les 1er mai et 28 octobre 2015 par le recourant au ministère public, ordonnance de classement du 4 septembre 2015 et courrier du ministère public du 30 octobre 2015). Ces pièces ont été établies postérieurement au jugement cantonal. Elles ne peuvent dès lors "résulter" de la décision attaquée et, partant, sont irrecevables.
2.
Dans un grief d'ordre formel qu'il convient d'examiner en premier lieu, le recourant se plaint d'une violation de son droit d'être entendu. Il invoque également l'art. 389 al. 1 CPP. Il reproche à la cour cantonale d'avoir rejeté les mesures d'instruction qu'il avait requises.
2.1. Selon l'art. 389 al. 1 CPP, la procédure de recours se fonde sur les preuves administrées pendant la procédure préliminaire et la procédure de première instance. L'art. 389 al. 3 CPP règle les preuves complémentaires. Ainsi, la juridiction de recours peut administrer, d'office ou à la demande d'une partie, les preuves complémentaires nécessaires au traitement du recours. Conformément à l'art. 139 al. 2 CPP, il n'y a pas lieu d'administrer des preuves sur des faits non pertinents, notoires, connus de l'autorité ou déjà suffisamment prouvés. Cette disposition codifie, pour la procédure pénale, la règle jurisprudentielle déduite de l'art. 29 al. 2 Cst. en matière d'appréciation anticipée des preuves (arrêt 6B_977/2014 du 17 août 2015 consid. 1.2 et les références). Le magistrat peut renoncer à l'administration de certaines preuves, notamment lorsque les faits dont les parties veulent rapporter l'authenticité ne sont pas importants pour la solution du litige. Ce refus d'instruire ne viole ainsi le droit d'être entendu des parties que si l'appréciation anticipée de la pertinence du moyen de preuve offert, à laquelle le juge a procédé, est entachée d'arbitraire (ATF 136 I 229 consid. 5.3 p. 236 s.; 131 I 153 consid. 3 p. 157 et les arrêts cités).
2.2. Le droit d'être entendu de l'art. 29 al. 2 Cst. implique également pour le juge l'obligation de motiver sa décision, afin que l'intéressé puisse se rendre compte de la portée de celle-ci et l'attaquer en connaissance de cause (ATF 139 IV 179 consid. 2.2 p. 183; 138 IV 81 consid. 2.2 p. 84). Selon la jurisprudence, la motivation d'une décision est suffisante lorsque l'autorité mentionne, au moins brièvement, les motifs qui l'ont guidée et sur lesquels elle a fondé son raisonnement. L'autorité ne doit toutefois pas se prononcer sur tous les moyens des parties; elle peut se limiter aux questions décisives (ATF 134 I 83 consid. 4.1 p. 88; 133 III 439 consid. 3.3 p. 445).
3.
En l'espèce, le recourant a requis les mesures d'instruction suivantes: la production des différentes procédures pénales en cours ou terminées concernant B._; la production par le Service cantonal des automobiles et de la navigation des véhicules immatriculés - ou anciennement immatriculés - au nom de B._, A._ SA, C._ SA, D._ GmbH et E._; la production par l'Office de l'assurance-invalidité de tout document permettant d'attester du versement d'une rente à E._; la production par F._ AG de tout document permettant d'attester de tous les contrats de leasing conclus au nom de E._; la production par G._ de tout document permettant d'attester de tous les contrats de leasing conclus au nom de H._, ainsi que les éventuelles plaintes pénales déposées dans le cadre de ces contrats; la production par I._ AG de tout document relatif aux commandes effectuées au nom de J._; les auditions de K._, L._, M._ et N._.
La cour cantonale a rejeté toutes ces mesures d'instruction par ordonnance du 27 novembre 2014, à savoir deux jours avant les débats d'appel, au motif qu'elles n'apparaissaient pas nécessaires pour le traitement de l'appel; le recourant a renouvelé ses réquisitions aux débats. Il a également requis l'audition de O._, le 27 novembre 2014. Lors de l'audience de jugement du 1er décembre 2014, la cour cantonale a refusé ce témoignage, au motif qu'il n'était pas déterminant. Elle a souligné que ces diverses mesures n'avaient pas été requises lors des débats de première instance alors que tous ces éléments étaient connus du recourant, sous réserve du témoignage de O._ qui lui serait parvenu ultérieurement; elle s'étonnait au surplus que le recourant n'avait eu connaissance des déclarations de ce témoin que tout dernièrement vu l'ancienneté des faits de la cause.
A la lecture des ordonnances des 27 novembre et 1er décembre 2014, on peine à trouver les raisons pour lesquelles la cour cantonale a estimé que les moyens de preuves requis n'étaient pas nécessaires au traitement de l'appel. Aucune motivation n'est en effet développée à l'appui de cette affirmation. Or, le recourant allègue que ces mesures d'instruction auraient permis de démontrer son innocence ou, à tout le moins, de mettre en cause les déclarations de B._; en particulier, O._ aurait pu témoigner que B._ avait commis ses agissements illicites avec la participation d'un tiers, ce qui le disculperait. Il ressort du jugement attaqué que la culpabilité du recourant a été établie essentiellement sur la base des déclarations de B._ - et que celui-ci n'a pas toujours dit la vérité, s'étant rétracté à l'enquête sur l'une ou l'autre des accusations qu'il avait formulées - et que la cour a reproché au recourant de ne pas démontrer ce qu'il avançait, se limitant à procéder par affirmation. Dans ces conditions, la cour cantonale devait expliquer pourquoi elle jugeait les mesures requises non pertinentes, en particulier l'audition du témoin O._. Les ordonnances étant muettes à cet égard, le Tribunal fédéral ne peut pas déterminer si l'appréciation anticipée à laquelle les juges ont procédé tombe sous le coup de l'arbitraire ou pas.
Le jugement attaqué consacre une violation du droit d'être entendu du recourant. Le recours doit par conséquent être admis, sans qu'il soit nécessaire d'examiner les griefs au fond.
4.
Au vu de ce qui précède, le recours doit être admis, l'arrêt attaqué annulé et la cause renvoyée à l'autorité cantonale pour nouvelle décision. Le recourant qui obtient gain de cause ne supportera pas de frais judiciaires (art. 66 al. 1 LTF) et peut prétendre à une indemnité de dépens à la charge du canton de Vaud (art. 68 al. 1 et 2 LTF), ce qui rend sans objet sa requête d'assistance judiciaire.
Au vu de l'issue du recours, la requête d'effet suspensif devient sans objet.
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est admis. Le jugement attaqué est annulé et la cause est renvoyée à l'autorité cantonale pour nouvelle décision.
2.
Il n'est pas perçu de frais judiciaires.
3.
L'Etat de Vaud versera au conseil du recourant une indemnité de 3'000 fr. à titre de dépens pour la procédure devant le Tribunal fédéral.
4.
Le présent arrêt est communiqué aux parties et à la Cour d'appel pénale du Tribunal cantonal du canton de Vaud.
Lausanne, le 21 mars 2016
Au nom de la Cour de droit pénal
du Tribunal fédéral suisse
Le Président : Denys
La Greffière : Mabillard