ForFarm/frontend/lib/marketData.ts

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),
}));
};