import { Injectable }                           from '@angular/core'
import { FormControl, FormGroup, Validators }   from '@angular/forms'

import { FormBase }                             from '../types/form-base'

@Injectable()
export class FormService {
  constructor() { }

  toFormGroup(inputs: FormBase<any>[] ) {
    let group: any = {};
    
    inputs.forEach(input => {
        let validatorArray = [];
        switch(input.type) {
            case 'radio-group': 
                input.options.forEach(option => {
                    group[option.identifier] = input.required ? 
                        new FormControl(option.value || '', Validators.required): 
                        new FormControl(option.value || '');
                })
                break;
            case 'checkbox':
            case 'radio':
                group[input.identifier] = input.required ? 
                    new FormControl('', Validators.required): 
                    new FormControl('');
                break;

            case 'terms':
                if(input.required) {
                    validatorArray.push(Validators.required)
                    validatorArray.push(Validators.pattern('1'))
                }


                group[input.identifier] = new FormControl(input.value || '', validatorArray)

            default:

                if(input.required)
                    validatorArray.push(Validators.required)


                if(!!input.validation) {
                    for(let validate of input.validation) {
                        switch(validate.type) {
                            case 'regex':
                                validatorArray.push(Validators.pattern(validate.value))
                                break;
                            case 'minlength':
                                if(validate.value > 0)
                                    validatorArray.push(Validators.minLength(validate.value))
                                break;
                            case 'maxlength':
                                if(validate.value > 0)
                                    validatorArray.push(Validators.maxLength(validate.value))
                                break;
                            default:
                                console.log('Validator type not found, please create custom validator')
                        }   
                    }
                }

                group[input.identifier] = new FormControl(input.value || '', validatorArray)

                break;
        }

    });
    return new FormGroup(group);
  }



// TODO: Move validation from cmp.form-input.ts to customValidator function
// customValidator(): ValidatorFn {
//   return (control: AbstractControl): {[key: string]: any} => {

//     const value = control.value;
//     const invalid = '...'; // Validation test goes here


//     return invalid ? {'customValidator': {name}} : null;
//   };
// }


  
}