← back to Watches
src/components/affiliate/JapanArbitrageCalc.jsx
317 lines
/**
* Japan Arbitrage Calculator
* Calculate profits from Japan → U.S. watch arbitrage
*/
import React, { useState } from 'react';
const popularModels = [
{
name: 'Speedmaster Professional 3861',
ref: '310.30.42.50.01.002',
japanPrice: 3900,
usPrice: 5000,
category: 'Speedmaster'
},
{
name: 'Seamaster Diver 300M',
ref: '210.30.42.20.01.001',
japanPrice: 2900,
usPrice: 3800,
category: 'Seamaster'
},
{
name: 'Aqua Terra GMT',
ref: '220.10.41.21.03.001',
japanPrice: 3200,
usPrice: 4200,
category: 'Aqua Terra'
},
{
name: 'Planet Ocean 600M',
ref: '215.30.44.21.01.002',
japanPrice: 4500,
usPrice: 6000,
category: 'Planet Ocean'
},
{
name: 'Speedmaster Moonwatch Hesalite',
ref: '310.30.42.50.01.001',
japanPrice: 3700,
usPrice: 4800,
category: 'Speedmaster'
}
];
const japanDealers = [
{ name: 'The Watch Company (Tokyo)', taxFree: true, shipping: 150 },
{ name: 'Jackroad & Betty', taxFree: true, shipping: 120 },
{ name: 'Komehyo', taxFree: false, shipping: 100 }
];
const usDealers = [
{ name: 'WatchBox', commission: 15, payout: 'fast' },
{ name: 'Chrono24', commission: 8, payout: 'slow' },
{ name: 'eBay Certified', commission: 12, payout: 'medium' },
{ name: 'Luxury Bazaar', commission: 10, payout: 'fast' }
];
export default function JapanArbitrageCalc() {
const [selectedModel, setSelectedModel] = useState(popularModels[0]);
const [japanDealer, setJapanDealer] = useState(japanDealers[0]);
const [usDealer, setUsDealer] = useState(usDealers[0]);
const [customJapanPrice, setCustomJapanPrice] = useState(null);
const [customUsPrice, setCustomUsPrice] = useState(null);
const [yenRate, setYenRate] = useState(150); // USD to JPY
const [importDuty, setImportDuty] = useState(0); // Usually 0 for watches under $800, or 2.5%
const japanPrice = customJapanPrice || selectedModel.japanPrice;
const usPrice = customUsPrice || selectedModel.usPrice;
// Calculate costs
const shipping = japanDealer.shipping;
const tax = japanDealer.taxFree ? 0 : japanPrice * 0.10; // 10% Japan consumption tax
const duty = importDuty > 0 ? japanPrice * (importDuty / 100) : 0;
const totalCost = japanPrice + shipping + tax + duty;
// Calculate revenue
const commission = (usPrice * usDealer.commission) / 100;
const netRevenue = usPrice - commission;
// Profit
const profit = netRevenue - totalCost;
const profitMargin = (profit / totalCost) * 100;
const roi = (profit / totalCost) * 100;
return (
<div className="max-w-4xl mx-auto p-6 bg-gradient-to-br from-slate-900 to-slate-800 rounded-xl shadow-2xl border border-slate-700">
<div className="mb-6">
<h2 className="text-2xl font-bold text-amber-400 mb-2">
🇯🇵 → 🇺🇸 Japan Arbitrage Calculator
</h2>
<p className="text-slate-400 text-sm">
Calculate profits from buying OMEGA in Japan and reselling in the U.S.
</p>
</div>
<div className="grid lg:grid-cols-2 gap-6">
{/* Left Column - Inputs */}
<div className="space-y-4">
{/* Model Selection */}
<div>
<label className="block text-sm font-semibold text-slate-300 mb-2">
Select Model
</label>
<select
value={selectedModel.ref}
onChange={(e) => {
setSelectedModel(popularModels.find(m => m.ref === e.target.value));
setCustomJapanPrice(null);
setCustomUsPrice(null);
}}
className="w-full bg-slate-700 text-white p-3 rounded-lg border border-slate-600 focus:border-amber-500 focus:outline-none"
>
{popularModels.map(model => (
<option key={model.ref} value={model.ref}>
{model.name} ({model.ref})
</option>
))}
</select>
</div>
{/* Japan Purchase */}
<div className="bg-slate-800 rounded-lg p-4 border border-slate-600">
<h3 className="text-sm font-bold text-amber-400 mb-3">🇯🇵 Japan Purchase</h3>
<div className="space-y-3">
<div>
<label className="block text-xs text-slate-400 mb-1">Dealer</label>
<select
value={japanDealer.name}
onChange={(e) => setJapanDealer(japanDealers.find(d => d.name === e.target.value))}
className="w-full bg-slate-700 text-white p-2 rounded text-sm border border-slate-600"
>
{japanDealers.map(dealer => (
<option key={dealer.name} value={dealer.name}>
{dealer.name} ({dealer.taxFree ? 'Tax-Free' : '+10% Tax'})
</option>
))}
</select>
</div>
<div>
<label className="block text-xs text-slate-400 mb-1">
Japan Price (USD)
</label>
<input
type="number"
value={customJapanPrice || japanPrice}
onChange={(e) => setCustomJapanPrice(parseFloat(e.target.value) || 0)}
className="w-full bg-slate-700 text-white p-2 rounded text-sm border border-slate-600"
placeholder={japanPrice}
/>
</div>
<div className="text-xs text-slate-400 space-y-1">
<div className="flex justify-between">
<span>Shipping:</span>
<span className="text-white">${shipping}</span>
</div>
{!japanDealer.taxFree && (
<div className="flex justify-between">
<span>Japan Tax (10%):</span>
<span className="text-yellow-400">${tax.toFixed(2)}</span>
</div>
)}
{duty > 0 && (
<div className="flex justify-between">
<span>Import Duty ({importDuty}%):</span>
<span className="text-yellow-400">${duty.toFixed(2)}</span>
</div>
)}
</div>
</div>
</div>
{/* U.S. Resale */}
<div className="bg-slate-800 rounded-lg p-4 border border-slate-600">
<h3 className="text-sm font-bold text-blue-400 mb-3">🇺🇸 U.S. Resale</h3>
<div className="space-y-3">
<div>
<label className="block text-xs text-slate-400 mb-1">Platform</label>
<select
value={usDealer.name}
onChange={(e) => setUsDealer(usDealers.find(d => d.name === e.target.value))}
className="w-full bg-slate-700 text-white p-2 rounded text-sm border border-slate-600"
>
{usDealers.map(dealer => (
<option key={dealer.name} value={dealer.name}>
{dealer.name} ({dealer.commission}% commission)
</option>
))}
</select>
</div>
<div>
<label className="block text-xs text-slate-400 mb-1">
U.S. Sale Price (USD)
</label>
<input
type="number"
value={customUsPrice || usPrice}
onChange={(e) => setCustomUsPrice(parseFloat(e.target.value) || 0)}
className="w-full bg-slate-700 text-white p-2 rounded text-sm border border-slate-600"
placeholder={usPrice}
/>
</div>
<div className="text-xs text-slate-400 space-y-1">
<div className="flex justify-between">
<span>Commission ({usDealer.commission}%):</span>
<span className="text-red-400">-${commission.toFixed(2)}</span>
</div>
<div className="flex justify-between">
<span>Net Revenue:</span>
<span className="text-green-400">${netRevenue.toFixed(2)}</span>
</div>
</div>
</div>
</div>
</div>
{/* Right Column - Results */}
<div>
{/* Profit Summary */}
<div className="bg-gradient-to-br from-amber-900 to-slate-800 rounded-lg p-6 border border-amber-500 mb-4">
<h3 className="text-lg font-bold text-white mb-4">💰 Profit Analysis</h3>
<div className="space-y-4">
<div>
<div className="text-xs text-slate-400">Total Cost</div>
<div className="text-xl font-bold text-white">
${totalCost.toLocaleString('en-US', { minimumFractionDigits: 2 })}
</div>
</div>
<div>
<div className="text-xs text-slate-400">Net Revenue</div>
<div className="text-xl font-bold text-blue-400">
${netRevenue.toLocaleString('en-US', { minimumFractionDigits: 2 })}
</div>
</div>
<div className="border-t border-amber-700 pt-3">
<div className="text-xs text-slate-400">Net Profit</div>
<div className={`text-3xl font-bold ${profit >= 500 ? 'text-green-400' : profit >= 0 ? 'text-yellow-400' : 'text-red-400'}`}>
${profit.toLocaleString('en-US', { minimumFractionDigits: 2 })}
</div>
</div>
<div className="grid grid-cols-2 gap-3">
<div className="bg-slate-800/50 rounded-lg p-3 text-center">
<div className="text-xs text-slate-400">Margin</div>
<div className={`text-lg font-bold ${profitMargin >= 20 ? 'text-green-400' : 'text-yellow-400'}`}>
{profitMargin.toFixed(1)}%
</div>
</div>
<div className="bg-slate-800/50 rounded-lg p-3 text-center">
<div className="text-xs text-slate-400">ROI</div>
<div className={`text-lg font-bold ${roi >= 20 ? 'text-green-400' : 'text-yellow-400'}`}>
{roi.toFixed(1)}%
</div>
</div>
</div>
</div>
</div>
{/* Best Models Table */}
<div className="bg-slate-800 rounded-lg p-4 border border-slate-600">
<h3 className="text-sm font-bold text-white mb-3">📊 Top Arbitrage Models</h3>
<div className="space-y-2 text-xs">
{popularModels
.map(model => ({
...model,
profit: model.usPrice - model.japanPrice - 150 - (model.usPrice * 0.10)
}))
.sort((a, b) => b.profit - a.profit)
.map(model => (
<div
key={model.ref}
onClick={() => {
setSelectedModel(model);
setCustomJapanPrice(null);
setCustomUsPrice(null);
}}
className={`flex justify-between items-center p-2 rounded cursor-pointer transition ${
selectedModel.ref === model.ref
? 'bg-amber-500/20 border border-amber-500'
: 'bg-slate-700 hover:bg-slate-600'
}`}
>
<span className="text-slate-300">{model.name}</span>
<span className="font-bold text-green-400">
~${model.profit.toFixed(0)}
</span>
</div>
))}
</div>
</div>
</div>
</div>
{/* Tips */}
<div className="mt-6 bg-blue-900/30 border border-blue-700 rounded-lg p-4">
<h4 className="text-sm font-bold text-blue-400 mb-2">💡 Pro Tips</h4>
<ul className="text-xs text-slate-300 space-y-1">
<li>• Buy from tax-free dealers (The Watch Company, Jackroad) to save 10%</li>
<li>• Watches under $800 usually have 0% import duty</li>
<li>• Weak yen = better arbitrage (current rate: ¥{yenRate}/USD)</li>
<li>• WatchBox offers fast payouts for bulk sellers</li>
<li>• Ship via EMS (fastest, tracked, insured)</li>
</ul>
</div>
</div>
);
}