mirror of
https://github.com/ForFarmTeam/ForFarm.git
synced 2025-12-18 21:44:08 +01:00
143 lines
3.4 KiB
TypeScript
143 lines
3.4 KiB
TypeScript
export interface ITrend {
|
|
direction: "up" | "down";
|
|
value: string;
|
|
}
|
|
|
|
export interface IMarketPrice {
|
|
market: string;
|
|
price: number;
|
|
demand: number;
|
|
trend: ITrend;
|
|
}
|
|
|
|
export interface IMarketData {
|
|
id: string;
|
|
name: string;
|
|
marketPrices: IMarketPrice[];
|
|
averagePrice: number;
|
|
recommendedPrice: number;
|
|
demandScore: number;
|
|
opportunity: boolean;
|
|
}
|
|
|
|
export interface IHistoricalData {
|
|
date: string;
|
|
price: number;
|
|
volume: number;
|
|
}
|
|
|
|
export interface IMarketComparison {
|
|
name: string;
|
|
price: number;
|
|
demand: number;
|
|
}
|
|
|
|
export const generateMarketData = (): IMarketData[] => {
|
|
const crops = ["Corn", "Wheat", "Soybeans", "Rice", "Potatoes", "Tomatoes", "Apples", "Oranges"];
|
|
const markets = ["National Market", "Regional Hub", "Local Market", "Export Market", "Wholesale Market"];
|
|
|
|
const getRandomPrice = (base: number) => Number((base + Math.random() * 2).toFixed(2));
|
|
const getRandomDemand = () => Math.floor(Math.random() * 100);
|
|
const getRandomTrend = (): ITrend =>
|
|
Math.random() > 0.5
|
|
? { direction: "up", value: (Math.random() * 5).toFixed(1) }
|
|
: { direction: "down", value: (Math.random() * 5).toFixed(1) };
|
|
|
|
return crops.map((crop) => {
|
|
const basePrice =
|
|
crop === "Corn"
|
|
? 4
|
|
: crop === "Wheat"
|
|
? 6
|
|
: crop === "Soybeans"
|
|
? 10
|
|
: crop === "Rice"
|
|
? 12
|
|
: crop === "Potatoes"
|
|
? 3
|
|
: crop === "Tomatoes"
|
|
? 2
|
|
: crop === "Apples"
|
|
? 1.5
|
|
: 8;
|
|
|
|
return {
|
|
id: crypto.randomUUID(),
|
|
name: crop,
|
|
marketPrices: markets.map((market) => ({
|
|
market,
|
|
price: getRandomPrice(basePrice),
|
|
demand: getRandomDemand(),
|
|
trend: getRandomTrend(),
|
|
})),
|
|
averagePrice: getRandomPrice(basePrice - 0.5),
|
|
recommendedPrice: getRandomPrice(basePrice + 0.2),
|
|
demandScore: getRandomDemand(),
|
|
opportunity: Math.random() > 0.7,
|
|
};
|
|
});
|
|
};
|
|
|
|
export const generateHistoricalData = (crop: string, days = 30): IHistoricalData[] => {
|
|
const basePrice =
|
|
crop === "Corn"
|
|
? 4
|
|
: crop === "Wheat"
|
|
? 6
|
|
: crop === "Soybeans"
|
|
? 10
|
|
: crop === "Rice"
|
|
? 12
|
|
: crop === "Potatoes"
|
|
? 3
|
|
: crop === "Tomatoes"
|
|
? 2
|
|
: crop === "Apples"
|
|
? 1.5
|
|
: 8;
|
|
|
|
const data: IHistoricalData[] = [];
|
|
let currentPrice = basePrice;
|
|
|
|
for (let i = days; i >= 0; i--) {
|
|
const date = new Date();
|
|
date.setDate(date.getDate() - i);
|
|
const change = (Math.random() - 0.5) * 0.4;
|
|
currentPrice = Math.max(0.5, currentPrice + change);
|
|
|
|
data.push({
|
|
date: date.toISOString().split("T")[0],
|
|
price: Number(currentPrice.toFixed(2)),
|
|
volume: Math.floor(Math.random() * 1000) + 200,
|
|
});
|
|
}
|
|
|
|
return data;
|
|
};
|
|
|
|
export const generateMarketComparisonData = (crop: string): IMarketComparison[] => {
|
|
const markets = ["National Market", "Regional Hub", "Local Market", "Export Market", "Wholesale Market"];
|
|
const basePrice =
|
|
crop === "Corn"
|
|
? 4
|
|
: crop === "Wheat"
|
|
? 6
|
|
: crop === "Soybeans"
|
|
? 10
|
|
: crop === "Rice"
|
|
? 12
|
|
: crop === "Potatoes"
|
|
? 3
|
|
: crop === "Tomatoes"
|
|
? 2
|
|
: crop === "Apples"
|
|
? 1.5
|
|
: 8;
|
|
|
|
return markets.map((market) => ({
|
|
name: market,
|
|
price: Number((basePrice + (Math.random() - 0.5) * 2).toFixed(2)),
|
|
demand: Math.floor(Math.random() * 100),
|
|
}));
|
|
};
|