<template>
<div>
<section class="form inputs">
<h3>Loan</h3>
<label>Name</label>
<input :value="loans[sel].title" required
@input="(e) => $emit('update:name', stripLetters(e))">
<button @click="() => $emit('del')">Delete</button>
</section>

<section class="form inputs">

<div class="hint">
	<img class="icon" src="/assets/image/icon/question-circle.svg" alt="">
	<div class="tooltip">
		<p>Assumes borrower is not self employed, not bankrupt in the past 7
		years, a citizen, and intends to occupy the property.</p>
	</div>
</div>

<h3>Borrower</h3>
<label>Number of Borrowers</label>
<input :value="estimate.borrowers"
@input="(e) => $emit('update:borrowers', stripInt(e))">
<label>Credit Score</label>
<input :value="estimate.creditScore"
@input="(e) => $emit('update:creditScore', stripInt(e))">
<label>Monthly Income ($)</label>
<input :value="estimate.mIncome"
@input="(e) => $emit('update:mIncome', strip(e))">

</section>

<section class="radios form">
<h3>Transaction Type</h3>
<input selected type="radio" name="transaction_type" value="0"
:value="estimate.transaction"
@input="() => $emit('update:transaction', 0)"
>
<label>Purchase</label>
<input type="radio" name="transaction_type" value="1"
:value="estimate.transaction"
@input="() => $emit('update:transaction', 1)"
>
<label>Refinance</label>
</section>

<section class="form inputs">
<h3>Property Details</h3>
<label>Price ($)</label>
<input :value="estimate.price" @input="(e) => $emit('update:price', strip(e))">
<label>Type</label>
<select id="" name=""
    :value="estimate.property"
    @change="(e) => $emit('update:property', e.target.value)">
	<option value="attched">Single Family Attached</option>
	<option value="detached">Single Family Detached</option>
	<option value="lorise">Lo-rise (4 stories or less)</option>
	<option value="hirise">Hi-rise (over 4 stories)</option>
</select>
</section>

<section class="radios form">
<h3>Loan Type</h3>
<input type="radio"
    name="loan_type"
    value="conv"
    @change="(e) => $emit('update:loanType', e.target.value)"
>
<label>Conventional</label>
<input type="radio"
    name="loan_type"
    value="fha"
    :checked="loans[sel].type == 'fha'"
    @change="(e) => $emit('update:loanType', e.target.value)">
<label>FHA</label>
<input type="radio"
    name="loan_type"
    value="va"
    :checked="loans[sel].type == 'va'"
    @change="(e) => $emit('update:loanType', e.target.value)">
<label>VA</label>
<input type="radio"
    name="loan_type"
    value="usda"
    :checked="loans[sel].type == 'usda'"
    @change="(e) => $emit('update:loanType', e.target.value)">
<label>USDA</label>
</section>

<section class="form inputs">
<h3>Loan Details</h3>
<label>Loan Term (years)</label>
<input :value="loans[sel].term"
@input="(e) => $emit('update:term', stripInt(e))">

<label>Loan Program</label>
<select id="" name=""
    :value="loans[sel].program"
    @change="(e) => $emit('update:program', e.target.value)">
	<option value="none">None</option>
</select>

<label>Loan to Value (%)</label>
<input :value="loan.ltv" @input="(e) => $emit('update:ltv', e)">
<label>Loan Amount ($)</label>
<input :value="loan.amount"
@input="(e) => $emit('update:amount', e)">
<label>Housing Expense DTI (%) - Optional</label>
<input :value="loans[sel].housingDti"
@input="(e) => $emit('update:housingDti', e)">
<label>Total DTI (%) - Optional</label>
<input :value="loans[sel].dti" @input="(e) => $emit('update:dti', e)">
<label>Home Owner's Association ($/month)</label>
<input :value="loans[sel].hoa"
@input="(e) => { $emit('update:hoa', strip(e)) }">

<label>Interest Rate (%)</label>
<input :value="loans[sel].interest"
@input="(e) => { $emit('update:interest', stripPerc(e)) }">
<label>Days of Interest</label>
<input :value="loans[sel].interestDays"
@input="(e) => $emit('update:interestDays', stripInt(e))">

<label>Hazard Insurance Escrow (months)</label>
<input :value="loans[sel].hazardEscrow"
@input="(e) => { $emit('update:hazardEscrow', stripInt(e)) }">
<label>Hazard Insurance ($/month)</label>
<input :value="loans[sel].hazard"
@input="(e) => $emit('update:hazard', strip(e))">

<label>Real Estate Tax Escrow (months)</label>
<input :value="loans[sel].taxEscrow"
@input="e => $emit('update:taxEscrow', stripInt(e))">
<label>Real Estate Tax ($/month)</label>
<input :value="loans[sel].tax"
@input="(e) => $emit('update:tax', strip(e))">
</section>

<section class="form inputs">
<h3>Fees</h3>
<div v-for="(fee, indx) in estimate.loans[sel].fees"
:key="fee.name + indx" class="fee"
>
	<label>
	${{fee.amount}}{{ fee.perc ? ` ${fee.perc}%` : ''}} - {{fee.name}}<br>
	{{fee.type}}
	</label>
	<img width="21" height="21" src="/assets/image/icon/x-red.svg"
	@click="() => estimate.loans[sel].fees.splice(indx, 1)">
</div>
<button @click="resetFees">Reset</button>
<button @click="createFee">New</button>
</section>

<fee-dialog v-if="newFee"
	:heading="'New Fee'"
	:initial="{}"
	:price="estimate.price"
	@close="() => newFee = null"
	@save="addFee"
/>

<section class="form inputs mi">
<h3>Mortgage Insurance</h3>
<div class="row">
    <input checked type="radio" name="mi"/><label>Manual %</label>
    <input type="checkbox" :checked="loans[sel].mi.monthly"
    @change="e => $emit('toggle:manualMIMonthly')" />
    <label>monthly</label>
</div>
<div class="row">
<input :value="loans[sel].mi.rate" @input="e => $emit('update:manualMI', stripPerc(e))" />
</div>
</section>

<section class="form inputs">

	<button @click="() => validate() && $emit('continue')">Continue</button>

	<ul class="errors">
	<li v-for="e in errors">{{e}}</li>
	</ul>

</section>

</div>
</template>

<script>
import FeeDialog from "../fee-dialog.vue"
import { stripLetters, strip, stripInt, stripPerc } from "../../helpers.js" 

const newFee = {
	name: '', type: '', amount: 0, perc: 0
 }

// Setup this.newFee for the creation dialog
function createFee() {
	this.newFee = Object.assign({}, newFee)
}

// If valid, add the current this.newFee to the array of fees and reset
// this.newFee to null
function addFee(fee, isDebit) {

	if (!isDebit) fee.amount = fee.amount * -1
	this.estimate.loans[this.sel].fees.push(fee)
	this.newFee = null
}


function validate() {
	let errors = []
	const estimate = this.estimate

	// Alternative attribute names for error messages
	const names = {
		term: "loan term",
		ltv: "loan to value",
		hazard: "hazard insurance",
		hazardEscrow: "hazard insurance escrow",
	}

	if (!estimate.property) {
		errors.push("Missing property type.")
	} else if (!estimate.price) {
		errors.push("Missing property price.")
	} else if (!estimate.borrowers) {
		errors.push("Missing number of borrowers.")
	} else if (!estimate.creditScore) {
		errors.push("Missing credit score.")
	} else if (!estimate.mIncome) {
		errors.push("Missing monthly income.")
	}
	
	estimate.loans.forEach(l => {
	    if (errors.length) return

	    if (!l.amount) {
	        errors.push(`${l.title} Loan amount cannot be zero`)
	    } else if (!l.interest) {
	        errors.push(`${l.title} Interest rate cannot be zero`)
	    } else if (!l.term) {
	        errors.push(`${l.title} Loan term cannot be zero`)
	    }
	})
	
	if (errors.length) {
	    this.errors = errors
	    return false
	}
	
	return true
}

function generate() {
    const errors = this.validate()
    if (errors.length) {
        this.errors = errors
        return
    }
    
    window.location.hash = 'new/summary'
}

export default {
	components: { FeeDialog },
	methods: {
		strip, stripInt, stripLetters, stripPerc, createFee, addFee, validate,
		generate
	},
	props: ['estimate', 'loans', 'sel', 'loan'],
	// Loan updates assume the currently selected loan is being modified, and
	// $emit has no need to clarify.
	emits: [
	    'del',
	    'update:name',
	    'update:borrowers',
	    'update:creditScore',
	    'update:mIncome',
	    'update:transaction', 
	    'update:price',
	    'update:property',
	    
	    // Loan specific emits
	    'update:loanType',
	    'update:term',
	    'update:program',
	    'update:ltv',
	    'update:amount',
	    'update:housingDti',
	    'update:dti',
	    'update:hoa',
	    'update:interest',
	    'update:interestDays',
	    'update:hazardEscrow',
	    'update:hazard',
	    'update:taxEscrow',
	    'update:tax',
	    'update:manualMI',
	    'toggle:manualMIMonthly',
	    
	    'continue'
	],
	data() {
		return {
				newFee: null,
				errors: [],
				hash: window.location.hash
			}
	},
	created() {
	}
}
</script>