import socket
from pathlib import Path
from typing import List

from pydantic import AliasChoices, BaseModel, Field


class Files(BaseModel):
    required: List[str] = []
    immutable: List[str] = []


class Groups(BaseModel):
    name: List[str] = []
    max_count: List[int] = Field(
        [], validation_alias=AliasChoices("max-count", "max_count")
    )
    time_period_hour: List[int] = Field(
        [], validation_alias=AliasChoices("time-period-hour", "time_period_hour")
    )


class Config(BaseModel):
    max_size: float = Field(
        10, ge=0, validation_alias=AliasChoices("max-size", "max_size")
    )
    files: Files = Files()
    sandbox_token: str = Field(
        "", validation_alias=AliasChoices("sandbox-token", "sandbox_token")
    )
    max_total_score: int = Field(
        100, validation_alias=AliasChoices("max-total-score", "max_total_score")
    )
    force_skip_health_check_on_test: bool = Field(
        False,
        validation_alias=AliasChoices(
            "force-skip-health-check-on-test", "force_skip_health_check_on_test"
        ),
    )
    force_skip_teapot_on_test: bool = Field(
        False,
        validation_alias=AliasChoices(
            "force-skip-teapot-on-test", "force_skip_teapot_on_test"
        ),
    )
    groups: Groups = Groups()
    root: Path = Path(".")
    path: Path = Path("repo.toml")
    grading_repo_name: str = Field(
        f"{socket.gethostname().split('-')[0]}-joj",
        validation_alias=AliasChoices("grading-repo-name", "grading_repo_name"),
    )
    health_check_score: int = Field(
        0, validation_alias=AliasChoices("health-check-score", "health_check_score")
    )
    submitter_in_issue_title: bool = Field(
        True,
        validation_alias=AliasChoices(
            "submitter-in-issue-title", "submitter_in_issue_title"
        ),
    )